将struct评估为bool

时间:2012-12-04 21:30:50

标签: c++

我坚持在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保留为普通旧数据。

2 个答案:

答案 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)

这不是该错误的正确代码。该错误表明它无法将xfoo转换为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