2015-10-03 40 views
6

衆所周知(或應該),將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的情況下產生「正確」的結果?

+1

未定義的行爲未定義... –

+0

@ T.C。是的,我知道,鏗鏘是否解決這個問題只是好奇,因爲這是一個衆所周知的問題,並沒有發出任何警告。 – vsoftco

回答

6

這是UB。 libC++不會以任何方式保護您。

+0

好的,我相信你,謝謝:) – vsoftco

+1

這是最糟糕的UB - 它似乎工作正常。 –