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