衆所周知(或應該),將std::min
的結果綁定到const
引用是一個非常糟糕的主意,只要std::min
的參數之一是右值,因爲const
引用綁定不通過函數返回傳播。如此以來,r
被晃來晃去下面的代碼沒有懸掛參考std :: min在libC++
#include <iostream>
#include <algorithm>
int main()
{
int n = 42;
const int& r = std::min(n - 1, n + 1); // r is dangling after this line
std::cout << r;
}
應該產生不確定的行爲。事實上,用gcc5.2編譯具有-Wall -O3
當編譯器吐出
警告:
<anonymous>
在這個函數[-Wuninitialized]用於初始化
然而,隨着鏗鏘編譯(LLVM 7.0.0)使用相同的標誌(甚至包括-Wextra
)不會發出任何警告,程序似乎「工作」,即顯示41
。
問題:鐺是否使用std::min
的「安全」版?像其中一個參數是右值時使用某個SFINAE按值返回的版本一樣?或者,它是不是需要發出任何診斷和程序「發生」,在這個UB的情況下產生「正確」的結果?
未定義的行爲未定義... –
@ T.C。是的,我知道,鏗鏘是否解決這個問題只是好奇,因爲這是一個衆所周知的問題,並沒有發出任何警告。 – vsoftco