2015-10-03 9 views
6

std::minの結果をconstのリファレンスにバインドすることは、std::minの引数の1つがrvalueである場合は常に非常に悪い考えですが、 const参照バインディングは関数戻りによって伝播されないためです。 rがぶら下がっているので、したがって、次のコードlibC++のstd :: minについてのダングリングリファレンスがありません

#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; 
} 

は未定義の動作を生成する必要があります。 -Wall -O3でgcc5.2でコンパイルするときそして実際、コンパイラが吐く

警告:<anonymous>が打ち鳴らすでコンパイル、

しかし、この関数[-Wuninitialized]に初期化されていない使用されている(LLVM 7.0.0) (-Wextraも含めて)同じフラグを使用しても警告は出力されず、プログラムは動作しているように見えます。すなわち、41と表示されます。

質問: clangはstd::minの「安全」バージョンを使用していますか?あるSFINAEを使用して引数の1つがrvalueであるときに値で返すバージョンのように?あるいは、単に診断を出す必要はなく、プログラムはこのUBシナリオで「正しい」結果を生み出すために「起こる」のだろうか?

+1

未定義の動作は未定義です... –

+0

@ T.C。はい、私は知っている、それはよく知られている問題であるので、これを固定したかどうかだけの骨董品であり、何も警告を発しません。 – vsoftco

答えて

6

UBです。 libC++はあなたをこの方法から保護しません。

+0

よろしくお願いいたします。 – vsoftco

+1

これはUBの最も厄介な種類です。正常に動作するようです。 –

関連する問題