[英]What it is going to be evaluated in a boolean expression?
假设我有以下变量
bool b;
int i;
T* ptr;
当我将b
, i
或ptr
或我拥有的任何其他变量放在类似布尔值的表达式中时
var1 && var2
要解决该表达式需要评估什么? C ++ 11标准说明了var1
和var2
哪些部分决定了布尔结果? 有隐式转换吗?
我不清楚标准对此有何说法。
编辑
我对如何将通用T
类型转换为bool
以及如何根据标准解决布尔表达式感兴趣
我不清楚您要问什么。 如果变量非零,则在C和C ++中为true。 &&运算符仅在左操作数为true时才评估右操作数。 除非存在转换函数,否则不存在T类实例的真值。 这一切都在标准中。
§5.14/ 1
&&
运算符组从左到右。 操作数都在上下文中转换为bool
类型(第4章)...与&
不同,&&
保证从左到右求值:如果第一个操作数为false
则不对第二个操作数求值。
§4/ 2
[ 注意:在几种情况下,具有给定类型的表达式将隐式转换为其他类型:
—用作运算符的操作数。 操作员对其操作数的要求决定了目标类型(第5条)。
...
这与标准一样清晰。 首先将var1
隐式转换为bool
,然后,如果为true
,则将var2
隐式转换为bool
。
编辑:我也会引用§4.12/ 1
算术,无作用域枚举,指针或指向成员类型的指针的prvalue可以转换为
bool
类型的prvalue。 零值,空指针值或空成员指针值将转换为false
; 其他任何值都将转换为true
。 可以将std::nullptr_t
类型的prvalue转换为bool
类型的prvalue; 结果值是false
。
编辑2:对于某些任意类型T
,请参见§4/ 3,
...某些语言构造要求将表达式转换为布尔值。 在这样的上下文中出现的表达式
e
被称为在上下文中转换为bool
,并且当且仅当声明bool t(e);
,它的格式才正确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中,这应视为不赞成使用的习惯用法。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.