以下哪项是正确的行为(g++ 与 clang++-12)?

Arn*_* De 0 c++ g++ clang++

以下是代码:

#include <iostream>

const int& temp_func() {
    return 3;
}

int main() {
    std::cout << temp_func() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

用g++编译时(Ubuntu 9.3.0-17ubuntu1~20.04),结果:

[1]    402809 segmentation fault ...
Run Code Online (Sandbox Code Playgroud)

另一方面,当使用 clang++-12 编译时,结果:

3
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 6

两者都是正确的。您的代码具有未定义的行为。当您创建return 3临时int对象时,函数返回的引用将绑定到该临时对象。return 语句完成后,该临时对象将被销毁,而引用将悬空。尽管该引用的任何访问都具有未定义的行为。

  • @ArnabDe 很可能 clang 不会在临时文件所在的内存位置执行任何操作,因此它只是访问该位置并且 3 仍然在那里,所以这就是您得到的。对于 gcc,它可能会将该内存位置标记为坏,因为它确实是坏的,这会导致崩溃。你已经打破了语言契约,所以编译器可以做任何它想做的事情,而这两个不同的编译器正在做两件不同的事情,这是完全合理的。 (2认同)