[英]Does having binaries with mismatched optimization levels (-O3, -O2, -O1, -O0) cause stability issues?
[英]Why my program return different results at optimization level of O0 and O2
這是我的代碼:
#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;
}
如果我使用O0選項g++ -O0 main.cpp -o main
編譯,則結果為1
。 如果使用O2選項g++ -O2 main.cpp -o main
編譯,則結果為0。
為什么這會給出不同的結果?
您的代碼具有未定義的行為 。
對於Min(1,2);
,構造了兩個從1
和2
初始化的臨時對象,然后將它們綁定到參考參數a
和b
。 請注意,臨時對象會立即(在完整表達式之后)銷毀。 Min()
通過引用返回a
或b
; 這意味着返回的引用總是懸空的,對其取消引用會導致UB,即一切皆有可能。
編輯
文字(如1
和2
)不能直接引用,而是需要臨時的 ,
when a prvalue is materialized so that it can be used as a glvalue, which occurs (since C++17)
會創建臨時對象,when a prvalue is materialized so that it can be used as a glvalue, which occurs (since C++17)
在以下情況下when a prvalue is materialized so that it can be used as a glvalue, which occurs (since C++17)
:
- 將引用綁定到prvalue
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.