将struct评估为bool

Gid*_*eon -4 c++

我坚持在c ++中将结构评估为bool

struct foo {
  int bar;
};
foo* x = (foo*)malloc(sizeof(foo));
int y = ( x ) ? 3 : 4;
Run Code Online (Sandbox Code Playgroud)

这是运行时发生的情况:

could not convert 'x' from 'foo' to 'bool'
Run Code Online (Sandbox Code Playgroud)

在搜索bool运算符时,我只能找到重载比较器bool运算符的方法.是否有直接评估结构作为bool运算符?

如果可能的话,我也想把foo保留为普通的旧数据.

Rob*_*edy 6

没有直接的evaluate-struct-as-a-bool运算符.这就是为什么有一种方法可以结构一个operator bool方法.它告诉编译器在bool上下文中使用时如何解释给定struct类型的值.

但是,您显示的代码不会使用这样的运算符,因为运算符适用于结构,而不是指向结构的指针 ; 你有一个类型的表达foo*,而不是foo.指针自动转换为,bool因为这是编译器知道如何执行的内在转换.空指针为false,非空指针为true.问题中显示的代码永远不会产生报告的错误消息.

如果你确实在编译器期望的地方有一个结构bool,并且你不能,无论出于什么原因,给结构一个operator bool方法,那么你可以用老式的方式执行转换并使用普通的函数:

bool interpret_foo_as_bool(foo const& f);
Run Code Online (Sandbox Code Playgroud)

根据需要实现该功能,然后调用它,传递您的foo值.例如:

foo* x = ...;
int y = interpret_foo_as_bool(*x) ? 3 : 4;
Run Code Online (Sandbox Code Playgroud)


Jos*_*eld 5

这可能不是该错误的正确代码.该错误指出,它不能转换xfoobool,但x就是没有一个foo,这是一个foo*.并且a foo* 可以转换为bool 1,因此您给出的代码不会出错.

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

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

在这种情况下,任何foo人总是会评估true.此转换bool被视为"不安全",因为您的对象可能会转换为bool某些意外的位置.为了解决这个问题,在C++ 03中你可以使用安全bool习语,在C++ 11中你可以标记operator boolexplicit:

struct foo {
  int bar;
  explicit operator bool() { return true; }
};
Run Code Online (Sandbox Code Playgroud)

explicit operator bool仍然会在某些地方,如在条件自动使用if语句和while循环.还有其他答案可以解决这个问题.


1算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为类型的prvalue bool.将零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.