以下哪项是正确的行为(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 语句完成后,该临时对象被销毁,留下悬空引用。通过该引用的任何访问都具有未定义的行为。