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シナリオで「正しい」結果を生み出すために「起こる」のだろうか?
未定義の動作は未定義です... –
@ T.C。はい、私は知っている、それはよく知られている問題であるので、これを固定したかどうかだけの骨董品であり、何も警告を発しません。 – vsoftco