C++ C++;移位运算符优先奇异性

C++ C++;移位运算符优先奇异性,c++,operator-overloading,C++,Operator Overloading,考虑以下代码: typedef vector<int> intVec; intVec& operator<<(intVec& dst, const int i) { dst.push_back(i); return dst; } int intResult0() { return 23; } int intResult1() { return 42; } // main intVec v; v << intR

考虑以下代码:

typedef vector<int> intVec;

intVec& operator<<(intVec& dst, const int i) {
    dst.push_back(i);
    return dst;
}
int intResult0() {
    return 23;
}
int intResult1() {
    return 42;
}

// main
intVec v;
v << intResult0() << intResult1();
typedef向量intVec;

intVec&operator这与优先级无关

最后一条语句中没有序列点,因此编译器可以按照自己喜欢的顺序计算子表达式,只要在组合子表达式时使用优先级即可

请注意,优先级并没有定义整体求值顺序,它只是定义了一个表达式中包含多个运算符的操作数的组合方式

例如,在以下表达式中:

a() * b() + c()
在某些情况下,编译器需要在添加
c()
的结果之前计算
(a()*b())
,但没有说明每个函数调用需要执行的顺序。编译器可以很容易地决定首先调用
c()
,将结果推送到堆栈上,然后执行任何需要执行的操作来计算
(a()*b())
表达式(在这种情况下,它可能会决定先计算
b()

优先级所起的唯一作用是不允许编译器将表达式计算为:

a() * (b() + c())

两个序列点之间的子表达式的求值顺序未定义

上述代码用于以下用途:

v.operator<<(intResult0()).operator<<(intResult1());

v.操作员根据Stroustrup第6.2.2节:

评价顺序 表达式中的子表达式是 未定义

C++标准,5:4/p> 除非另有说明,否则 单个操作数的计算 算子与子表达式 单个表达式和顺序 发生副作用的原因是什么 未指明


呵呵,我昨晚刚刚遇到了运算符+=的问题,让我困惑的是,在阅读代码时,您可能会希望第二个调用intResult1,因为它使用intResult0返回的值作为第一个参数。