-3

我坚持将结构评估为 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 保留为普通的旧数据。

4

2 回答 2

6

没有直接的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;
于 2012-12-04T21:35:57.137 回答
6

这不可能是该错误的正确代码。该错误表明它无法xfooto转换bool,但x不是a ,而是fooa 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 boolexplicit

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

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


1算术、无作用域枚举、指针或指向成员类型的指针的纯右值可以转换为类型的纯右值bool。零值、空指针值或空成员指针值转换为false; 任何其他值都转换为true.

于 2012-12-04T21:36:29.853 回答