它将在布尔表达式中进行评估?

时间:2014-03-07 07:05:40

标签: c++ c++11 boolean-expression

假设我有以下变量

bool b;
int i;
T* ptr;

当我将biptr或其他任何变量放在一个布尔表达式中时,如

var1 && var2

要解决这个表达式会被评估什么? C ++ 11标准说明了var1var2中有助于确定布尔结果的部分是什么?有隐式铸造吗?

我不清楚标准对此有何看法。


修改

我对如何将通用T类型转换为bool以及如何根据标准解决布尔表达式感兴趣

2 个答案:

答案 0 :(得分:4)

我不清楚你在问什么。如果变量为非零,则C和C ++中的变量为真。和&&如果左操作数为true,则运算符仅计算右操作数。除非存在转换函数,否则类T的实例的真值不存在。这都属于标准。

答案 1 :(得分:3)

§5.14/ 1

  

&&运算符组从左到右。操作数都在上下文中转换为bool类型(第4条)...与&不同,&&保证从左到右   评估:如果第一个操作数为false,则不评估第二个操作数。

§4/ 2

  

[注意:具有给定类型的表达式将在多个上下文中隐式转换为其他类型:

     

- 用作运算符的操作数。运营商对其操作数的要求决定了目的地类型(第5条)。

     

...

这与标准一样清晰。第一个var1将隐式转换为bool,如果是true,则var2将隐式转换为bool

编辑:我还会引用§4.12/ 1

  

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为a   bool类型的prvalue。零值,空指针值或空成员指针值将转换为false;   任何其他值都将转换为true。类型std::nullptr_t的prvalue可以转换为prvalue   输入bool;结果值为false

编辑2:对于某些任意类型T,请参阅§4/ 3,

  

......某些语言结构要求表达式为   转换为布尔值。出现在这样的上下文中的表达式e被称为上下文   转换为bool 并且当且仅当声明bool t(e);格式正确时,格式正确   发明了临时变量t(8.5)。

有关此初始化的含义,请参见§8.5/ 16

  

- 否则,如果源类型是(可能是cv限定的)类类型,则考虑转换函数。   列举了适用的转换函数(13.3.1.5),并通过选择最佳函数   超载分辨率(13.3)。调用所选的用户定义转换以转换初始化程序   表达到正在初始化的对象中。如果转换无法完成或模糊不清,那么   初始化是不正确的。

§13.3.1.5和§13.3中有更多细节,但你会整夜阅读,然后是一些。但最重要的是,如果T是类类型,则必须有转换函数。最佳做法是为班级定义explicit operator bool。但是,您也可以执行operator void*之类的操作,这是std::ios及其派生类定义的内容,因为void*可以在标准转换序列中转换为bool。 (这应该被视为C ++ 11中不推荐使用的习语。)