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返回的值作为第一个参数。