重载逗号运算符*是否真的影响其操作数的评估顺序?

时间:2011-10-19 11:26:49

标签: c++ operator-overloading language-lawyer operator-precedence comma-operator

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

  

[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文字。是否有任何规范文本定义此规则,或者兼容的编译器是否可以忽略它?

1 个答案:

答案 0 :(得分:10)

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

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

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