将结构求值为布尔

Evaluate struct as a bool

本文关键字:布尔 结构      更新时间:2023-10-16

我一直在用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保留为普通的旧数据。

这不可能是该错误的正确代码。该错误指出,它无法将xfoo转换为bool,但x而不是foo,它是foo*。并且foo*可以转换为bool1,所以您给出的代码不会有错误。

如果您希望能够使用foo对象作为条件,则需要为foo类提供operator bool成员函数:

struct foo {
int bar;
operator bool() { return true; }
};
foo x;
int y = x ? 3 : 4;

在这种情况下,任何foo都将始终计算为true。这种到bool的转换被认为是"不安全的",因为您的对象可能在某些意外的地方被转换为bool。为了解决这个问题,在C++03中,您可以使用安全布尔习惯用法,在C++11中,您可以将operator bool标记为explicit:

struct foo {
int bar;
explicit operator bool() { return true; }
};

explicit operator bool仍将在某些地方自动使用,例如if语句和while循环中的条件。还有其他的答案涵盖了这一点。


1算术、无范围枚举、指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。零值、空指针值或空成员指针值被转换为false;任何其它值被转换为CCD_ 22。

没有直接的评估结构即布尔运算符。这就是为什么有一种方法一个结构一个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;