7

在 C++11 之前,我们知道运算符需要短路和求值顺序,&&因为:

1.9.18

在以下表达式的评估中

a && b
a || b
a ? b : c
a , b

使用这些表达式中运算符的内置含义,在对第一个表达式(12) 求值之后有一个序列点。

但是 C++11 中不再存在序列点,那么标准部分在哪里说:

if (ptr && ptr->do_something())
{
}

是安全的?

4

1 回答 1

14

[expr.log.and]

&&运算符从左到右分组。操作数都根据上下文转换为bool(第 4 条)。如果两个操作数都为真,则结果为真,否则为假。与 不同&&&保证从左到右的评估:如果第一个操作数为假,则不评估第二个操作数。

结果是一个bool. 如果计算第二个表达式,则与第一个表达式关联的每个值计算和副作用在与第二个表达式关联的每个值计算和副作用之前排序。

于 2014-11-15T05:44:47.387 回答