重载的按位或运算符('|')是否具有定义明确的求值顺序?

时间:2018-11-28 07:05:39

标签: c++ operator-overloading language-lawyer bitwise-or

如果我的C ++类已重载按位或运算符(|),那么C ++语言规范是否可以保证传递给对该运算符的一系列调用的参数将从左到右求值?还是评估顺序的实现是定义的(或未定义的)?

(IIRC C ++的内置|运算符具有实现定义的求值顺序;但是当运算符为某个类重载时,它可能会有所不同吗?)

下面是一个程序,它举例说明了我要问的问题:该程序是否保证可以打印出0 1 2 3 4(就像我目前坐在的Mac上一样),或者可以合法打印出{{ 1}}(或某些其他排序)在某些环境中?

4 3 2 1 0

1 个答案:

答案 0 :(得分:4)

如果内置运算符规定了特定的顺序,则对于过载也将以相同的顺序评估参数。这是相关段落(来自n4659,C ++ 17草案),重点是我的:

  

[over.match.oper]

     

2如果任何一个操作数的类型都是类或枚举,   可以声明一个用户定义的运算符函数来实现   可能需要此运算符或用户定义的转换   将操作数转换为适合内置运算符的类型。在   在这种情况下,使用重载分辨率来确定哪个运算符   函数或内置运算符将被调用以实现   操作员。因此,运算符符号首先转换为   表12中汇总的等效函数调用表示法(其中@   表示指定子条款中涵盖的运算符之一)。   但是,操作数的顺序是为   内置运算符(子句[expr])。

所以不,重载的operator|将没有明确定义的求值顺序,因为内置函数没有求位顺序。