繁体   English   中英

布尔表达式将要评估什么?

[英]What it is going to be evaluated in a boolean expression?

假设我有以下变量

bool b;
int i;
T* ptr;

当我将biptr或我拥有的任何其他变量放在类似布尔值的表达式中时

var1 && var2

要解决该表达式需要评估什么? C ++ 11标准说明了var1var2哪些部分决定了布尔结果? 有隐式转换吗?

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


编辑

我对如何将通用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM