它将在布尔表达中评估

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

本文关键字:评估 布尔表      更新时间:2023-10-16

假设我有以下变量

bool b;
int i;
T* ptr;

当我放置 biptr或其他任何其他变量时,

var1 && var2

将要评估什么以解决此表达?C 11标准说明了有助于确定布尔结果的var1var2的部分?有隐式铸造?

我不清楚标准对此有何评论。


编辑

我对如何将通用T类型转换为bool以及如何根据标准

解决布尔表达方式感兴趣

我不清楚您要问什么。如果变量为非零,则在C和C 中为true。& amp;操作员仅在左操作数为True时才评估右操作数。除非有转换函数,否则不存在类T类实例的真实价值。这全都在标准中。

§5.14/1

&&操作员组从左到右。操作数既可以上下文转换为类型bool(第4条)...与&不同,&&可保证从左到右 评估:如果第一操作数为false

,则未评估第二操作数。

§4/2

[注意:带有给定类型的表达式将在多种情况下隐式转换为其他类型:

- 用作操作员的操作数。操作数对操作数的要求决定目标类型(第5条)。

...

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

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

可以将算术,未枚举,指针或指向成员类型的指针转换为 bool类型的Prvalue。零值,空指针值或NULL成员指针值转换为false; 任何其他值都转换为truestd::nullptr_t型的贵族可以转换为 类型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中的不弃用成语。)