以下哪项是正确的行为(g++ vs clang++-12)?
Which of the following is the correct behavior (g++ vs clang++-12)?
代码如下:
#include <iostream>
const int& temp_func() {
return 3;
}
int main() {
std::cout << temp_func() << std::endl;
}
用g++编译时(Ubuntu 9.3.0-17ubuntu1~20.04),结果:
[1] 402809 segmentation fault ...
另一方面,当用 clang++-12 编译时,结果:
3
没有“正确的行为”。该程序通过返回对 temporary 的悬空引用来表现出未定义的行为,该引用是文字 3 的副本。由于它是未定义的行为,因此任何事情都可能发生:程序可能会崩溃,但它可能会默默地成功,它可能会显示 4,也可能会间歇性地失败。您看到的两种行为都是 C++ 标准可接受的。
两者都是正确的。您的代码具有未定义的行为。当您执行 return 3
时,将创建一个临时 int
对象,并且函数 returns 的引用将绑定到该临时对象。 return 语句完成后,该临时对象被销毁,留下悬空引用。通过该引用的任何访问都具有未定义的行为。
代码如下:
#include <iostream>
const int& temp_func() {
return 3;
}
int main() {
std::cout << temp_func() << std::endl;
}
用g++编译时(Ubuntu 9.3.0-17ubuntu1~20.04),结果:
[1] 402809 segmentation fault ...
另一方面,当用 clang++-12 编译时,结果:
3
没有“正确的行为”。该程序通过返回对 temporary 的悬空引用来表现出未定义的行为,该引用是文字 3 的副本。由于它是未定义的行为,因此任何事情都可能发生:程序可能会崩溃,但它可能会默默地成功,它可能会显示 4,也可能会间歇性地失败。您看到的两种行为都是 C++ 标准可接受的。
两者都是正确的。您的代码具有未定义的行为。当您执行 return 3
时,将创建一个临时 int
对象,并且函数 returns 的引用将绑定到该临时对象。 return 语句完成后,该临时对象被销毁,留下悬空引用。通过该引用的任何访问都具有未定义的行为。