想问一下大佬们关于这份代码:
#include<bits/stdc++.h>
class Test{
private:
int a;
public:
void set(int x){
a=x;
}
void show(){
printf("%d\n",a);
}
Test operator++ (){
++a;
return *this;
}
Test operator++ (int){
Test t;
t=*this;
++a;
return t;
}
};
signed main(){
Test foo, bar;
foo.set(10);
bar = ++ (++foo);
foo.show();
bar.show();
bar = (foo++) ++;
foo.show();
bar.show();
}
首先++ (++foo) 和 (fo++) ++ 好像都是未定义行为,因为修改了两次同一个变量而没有序列点,,但编译器也没有报错,输出也正常,请问这是为什么呢?
还有(foo++) ++ 是不是进行了对右值的修改?如果是,为什么编译器也没有报错,而且输出正常呢?
(使用的编译器是gcc 8.1.10)
感谢各位大佬解答qwq
输出:
11
12
12
11
和猜想一样,但竟然没有报错什么的让我很惊讶(
你这个调用的时 operator++ ,是函数调用,不是内置的自增运算符。所以这里适用函数调用的规则。内置自增运算符的规则并不适用。
所以 ++(++a) 是 a.operator++().operator++()
(a++)++ 是 a.operator++(0).operator++(0)
序列点要按函数调用的规则分析。
在成员函数调用的时候,对临时对象(右值)也是可以调用非 const 成员函数的。