从函数返回引用并修改它

Sam*_*uel 3 c++ reference

#include<iostream>
int& f(){
 static int x = 0;
 x++;
 return x;
}

int main(){

  f() += 1; //A

 f() = f() + 1; //B
 std::cout << f();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在gcc上输出6,在MSVC上输出5.现在,当我修改A,并Bf()=f()我弄5两种编译器.这有什么大不了的?行为是否未定义.如果是,为什么?

小智 5

它是未定义的,因为在此代码中:

f() = f() + 1;
Run Code Online (Sandbox Code Playgroud)

没有定义哪个调用f()首先发生.

  • 难道你不认为这是不明确的行为吗?是否在两个序列点之间修改了x的值不止一次,即使我们有一个函数调用,它本身就是一个序列点? (2认同)