根据this question (也就是说,OP陈述了这一信念并且没有得到纠正) - 链式运算符向左增长:
a << b << c << d;
// ==
operator<<( operator<<( operator<<(a, b), c ), d);
为什么会出现这样的情况呢?这样做不是更有效率吗:
operator<<( operator<<(a, b), operator<<(c, d) );
也就是说,尽可能平衡?
编译器肯定可以解决这个问题以获得更好的运行时性能吗?
最佳答案
当您在 C++ 中重载运算符时,它会保留与未重载时运算符相同的优先级和结合性。
对于移位运算符( <<
和 >>
),标准要求:
The shift operators << and >> group left-to-right.
这意味着类似 a<<b<<c
的操作必须解析为 (a<<b)<<c
.
重载运算符会更改为每个操作调用的代码,但对分组没有影响 - 无论 a
分组都将相同。 , b
和c
是否属于将使用编译器提供的运算符的内置类型(例如 int
),或者它们是否是将使用重载运算符的某些类类型。无论哪种方式,处理分组的解析器都保持相同。
但请注意,order of evaluation is independent of precedence or associativity ,所以这不一定会影响执行速度。
关于c++ - 运算符链接,为什么要增长左分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28121155/