14

逗号运算符保证从左到右的评估顺序。

[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——尾注]

但是,这是非规范性文本。是否有任何规范性文本定义此规则,或者兼容的编译器是否可以忽略它?

4

1 回答 1

10

我手头只有 03 标准,但其中 5/3 说“第 5 条定义了运算符在应用于未重载的类型时的效果。”

因此,所有第 5 条,包括 5.18/1,仅适用于内置运算符,不适用于任何重载函数。

(不过,兼容的编译器总是可以将操作数评估为operator ,()从左到右的重载。)

于 2011-10-19T12:03:28.370 回答