逗号运算符保证从左到右的求值顺序。
[n3290: 5.18/1]
:逗号操作符从左到右分组expression: assignment-expression expression , assignment-expression
用逗号分隔的一对表达式从左到右求值;左边的表达式是一个丢弃的值表达式(第5条)与左表达式相关的值计算和副作用在每个值计算和副作用关联之前进行排序用正确的表达。结果类型和值为右操作数的类型和值;结果是相同的值类别作为其右操作数,如果其为右操作数,则为位域是一个全局值和位域。
关于运算符的唯一另一个子句没有提到求值顺序。因此,当操作符被重载时,情况似乎仍然是这样。
但是,再往上看,在关于表达式的一般演讲中,当然,当你重载操作符时,规则会改变:
[n3290: 5/2]:
[注:运算符可以重载,即给定适用于类类型表达式时的含义(第9条)或枚举类型(7.2)。对重载操作符的使用进行了转换转换为函数调用,如13.5所述。重载操作符遵守语法规则在第5条中规定,但要求操作数类型、值类别和求值顺序由函数调用规则。操作符之间的关系,如++a
即a+=1
,不能保证重载操作符(13.5),并且对于bool
类型的操作数不能保证。 -end note]
然而,这是非规范文本。是否有任何规范的文本定义此规则,或者兼容的编译器可以忽略它?
我手上只有03标准,但是其中5/3说"第5条定义了操作符在应用于未重载的类型时的效果。"
因此,所有第5条,包括5.18/1,只适用于内置操作符,而不适用于任何重载函数。
(兼容的编译器总是可以将操作数求值为从左到右的重载operator ,()
)