逗号运算符保证从左到右的评估顺序。
[n3290: 5.18/1]
:逗号运算符从左到右分组。expression: assignment-expression expression , assignment-expression
用逗号分隔的一对表达式从左到右评估; 左表达式是废弃的值表达式(第5条)。的每 值计算和与左表达式相关的副作用 在每个值计算和副作用相关之前进行排序 使用正确的表达式。结果的类型和值是 右操作数的类型和值;结果具有相同的值 category作为右操作数,如果是右操作数则是一个位字段 是一个glvalue和一个位域。
关于运营商的唯一其他条款没有提及评估顺序。因此,当运算符过载时,情况似乎仍然存在。
但是,进一步说,在关于表达式的一般说法中,当然会指出当你重载运算符时规则会改变:
[n3290: 5/2]:
[注意:运算符可以重载,即给定 当应用于类类型的表达式(第9条)或 枚举类型(7.2)。重载运算符的使用被转换 进入13.5中描述的函数调用。 重载运算符服从 第5条规定的语法规则,但要求 操作数类型,值类别和评估顺序由替换 函数调用的规则。运算符之间的关系,例如++a
意味着a+=1
,不保证重载运算符(13.5),和 不保证类型为bool
的操作数。 -end note ]
但是,这是non-normative文字。是否有任何规范文本定义此规则,或者兼容的编译器是否可以忽略它?
答案 0 :(得分:10)
我只有03标准,但在其中5/3表示“第5条定义了运算符在应用于尚未超载的类型时的效果。”
因此,第5节(包括5.18 / 1)的所有内容仅适用于内置运算符,而不适用于任何重载函数。
(兼容的编译器总是可以将操作数从左到右评估为过载的operator ,()
。)