假设我有以下变量
bool b;
int i;
T* ptr;
当我将b
,i
或ptr
或其他任何变量放在一个布尔表达式中时,如
var1 && var2
要解决这个表达式会被评估什么? C ++ 11标准说明了var1
和var2
中有助于确定布尔结果的部分是什么?有隐式铸造吗?
我不清楚标准对此有何看法。
修改
我对如何将通用T
类型转换为bool
以及如何根据标准解决布尔表达式感兴趣
答案 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中不推荐使用的习语。)