运算符重载中的问题

我们知道c++的运算符是可以重载的(个别除外)。

class A{};
A& operator,(A&, A&); //重载了逗号运算符
bool operator&&(A&, A&); //重载了&&运算符

A b1, b2;

if (b1&&b2) b1, b2; // if(operator&&(b1, b2)) operator,(b1,b2);

可以看到,重载了运算符之后,对运算符的使用被替换为相应的函数调用形式。因此,旧有的运算符的执行顺序不再适用,取而代之的是函数参数的压栈顺序。

短路语义只是一个方面,更重要的在于压栈顺序。鉴于执行效率和旧代码兼容性等细节问题,C++标准在压栈顺序上给编译器的开发者留有很大自主性。标准的说辞是,编译器可能以任何它觉得方便的顺序将参数压栈,从左到右,从右到左,甚至从中间到两边,在这一点上我们不能安全地做任何假设。在上面的例子中,编译器生成的代码可能先计算b1再计算b2,也可能是相反的顺序。

少用为妙~~~