我坚持在c ++中将结构评估为bool
struct foo {
int bar;
};
foo* x = (foo*)malloc(sizeof(foo));
int y = ( x ) ? 3 : 4;
运行时会发生这种情况:
could not convert 'x' from 'foo' to 'bool'
在搜索bool运算符时,我只能找到重载比较器bool运算符的方法。是否有直接评估结构作为bool运算符?
如果可能的话,我也希望将foo保留为普通旧数据。
答案 0 :(得分:6)
没有直接的evaluate-struct-as-a-bool运算符。那是为什么有一种方法可以给一个结构operator bool
方法。它告诉编译器在bool
上下文中使用时如何解释给定结构类型的值。
你所展示的代码不会使用这样的运算符,因为运算符适用于结构,而不是指针结构;您的表达式为foo*
,而不是foo
。指针自动转换为bool
,因为这是编译器知道如何执行的内在转换。空指针为false,非空指针为true。问题中显示的代码永远不会产生报告的错误消息。
如果你确实在编译器期望bool
的地方有一个结构,并且你不能,无论出于何种原因,给结构一个operator bool
方法,那么你可以执行转换老式的方式和使用普通的功能:
bool interpret_foo_as_bool(foo const& f);
实现您想要的功能,然后调用它,传递您的foo
值。例如:
foo* x = ...;
int y = interpret_foo_as_bool(*x) ? 3 : 4;
答案 1 :(得分:5)
这不是该错误的正确代码。该错误表明它无法将x
从foo
转换为bool
,但x
不 a foo
,它是foo*
。并且foo*
可以转换为bool 1 ,因此您提供的代码不会出错。
如果您希望能够将foo
对象用作条件,则需要为operator bool
类提供foo
成员函数:
struct foo {
int bar;
operator bool() { return true; }
};
foo x;
int y = x ? 3 : 4;
在这种情况下,任何foo
将始终评估为true
。转换为bool
被视为“不安全”,因为您的对象可能会在某些意外的位置转换为bool
。为了解决这个问题,在C ++ 03中,您可以使用safe bool idiom,在C ++ 11中,您可以将operator bool
标记为explicit
:
struct foo {
int bar;
explicit operator bool() { return true; }
};
explicit operator bool
仍会在某些地方自动使用,例如if
语句和while
循环中的条件。 other answers涵盖了这一点。
1 算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为
bool
类型的prvalue。零值,空指针值或空成员指针值将转换为false
;任何其他值都将转换为true
。