为什么我的程序在O0和O2的优化级别返回不同的结果

coi*_*ung 0 c++ gcc compiler-optimization

这是我的代码:

#include<iostream>

const int & Min(const int& a, const int& b);


int main() {
    using namespace std;

    auto&& val = Min(1,2);

    cout << val << endl;
    return 0;
}


const int & Min(const int& a, const int& b) {
    return a < b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用O0选项编译它g++ -O0 main.cpp -o main,结果是1.如果我使用O2选项编译g++ -O2 main.cpp -o main,则会得到0的结果.

为什么会给出不同的结果?

son*_*yao 14

您的代码具有未定义的行为.

对于Min(1,2);,两个临时对象初始化12构造然后绑定到引用参数ab.请注意,临时对象会立即销毁(在完整表达式之后).Min()返回ab通过引用返回; 这意味着返回的引用始终是悬空的,取消引用它会导致UB,即一切皆有可能.

编辑

文字(喜欢12)不能直接引用,而是需要临时,

when a prvalue is materialized so that it can be used as a glvalue, which occurs (since C++17)在以下情况下创建临时对象:

  • 绑定对prvalue的引用