繁体   English   中英

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

[英]Does overloading the comma operator *really* affect the order of evaluation of its operands?

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

[n3290: 5.18/1] :逗号运算符从左到右分组。

 expression: assignment-expression expression , assignment-expression 

用逗号分隔的一对表达式从左到右进行评估 ; 左表达式是废弃的值表达式(第5条)。 在与右表达式相关联的每个值计算和副作用之前,对与左表达式相关联的每个值计算和副作用进行排序。 结果的类型和值是右操作数的类型和值; 结果与右操作数具有相同的值类别,如果右操作数是glvalue和位域,则是一个位域。

关于运营商的唯一其他条款没有提到评估顺序。 因此,当操作员过载时,情况似乎仍然存在。

但是,接下来,在关于表达式的一般方面,当然,当你重载运算符时,规则会发生变化:

[n3290: 5/2]: [ 注意:操作符可以重载,也就是说,当应用于类类型(第9节)或枚举类型(7.2)的表达式时给定含义。 重载运算符的使用将转换为函数调用,如13.5中所述。 重载运算符遵循第5章中指定的语法规则,但操作数类型,值类别和评估顺序的要求将替换为函数调用的规则。 运算符之间的关系,例如++a表示a+=1 ,不能保证重载运算符(13.5),并且不保证bool类型的操作数。 - 尾注 ]

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM