2014-03-07 118 views
-1

假设我有以下变量它将在布尔表达式中进行评估?

bool b; 
int i; 
T* ptr; 

当我把biptr,或任何其他变量我有,在一个布尔表达式像

var1 && var2 

这是怎么回事进行评估解决这个表达? C++ 11标准说明了什么是var1var2的部分,它们有助于确定布尔结果?有隐式投射?

目前还不清楚我是什么标准说这件事。


编辑

我感兴趣的是如何通用T类型是根据标准

回答

3

§5.14/ 1

&&操作员组左到右。操作数被上下文转换为类型bool(条款4)...不同于&,&&保证从左到右 评估:如果第一个操作数是false,则不评估第二个操作数。

§4/ 2

[注:表达式与给定类型将被隐式转换到其它类型的在若干上下文:

- 当用作运算符的操作数使用。操作员对操作数的要求决定了目标类型(第5章)。

...

这是几乎一样澄清的标准得到。首先var1将被隐式转换为bool,然后,如果是truevar2将被隐式转换为bool

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

算术,无作用域枚举,指针,或指向构件类型的prvalue可以被转换为一个 prvalue bool类型。零值,空指针值或空成员指针值被转换为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中被看作是一个不赞成使用的习惯用语。)

+0

你的任何引用都不会说“如何”,我的观点恰恰是“如何”,应该发生什么以及如何评估。 – user2485710

+2

那么,你的问题根本不使用“how”这个词。目前还不清楚你在问什么...... – Brian

+2

@ user2485710它取决于类型以及它是否定义了任何自定义转换函数。对于数字和指针类型,非零/非null为true,而零/ null为false。 –

4

这不是很清楚,我转换成bool和一个布尔表达式是如何解决你”再问一次。 C和C++中的变量如果不为零,则为true。如果左操作数为真,则运算符仅评估右操作数。除非有转换函数,否则T类实例的真值不存在。这都是标准。

+0

你答案的最后部分是关于“短路评估”,这不是我的观点。根据你的答案的第一部分,我应该假设仅仅“左值”有助于表达? – user2485710

+0

我不知道你的观点是什么,我是这么说的。你的问题中没有l值。请澄清。 – EJP

+0

我刚刚编辑了我的问题,让我们看看现在是否更清晰。 – user2485710