众所周知(或应该知道),将
由于
问题:clang是否使用了“安全”的版本的
std::min
的结果绑定到 const
引用是一个非常糟糕的想法,每当 std::min
的参数之一是 rvalue 时,因为 const
引用绑定不会通过函数返回进行传播。因此以下代码:#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;
}
由于
r
是悬空的,因此应该产生未定义的行为。实际上,在使用-Wall -O3
编译时,使用gcc5.2编译器会输出以下警告信息:
然而,使用相同标志(甚至包括warning:
<anonymous>
is used uninitialized in this function [-Wuninitialized]
-Wextra
)编译器clang(llvm 7.0.0)不会发出任何警告,并且程序似乎“工作正常”,即显示41
。问题:clang是否使用了“安全”的版本的
std::min
?例如,使用某些SFINAE在其中一个参数为rvalue时返回值的版本?还是根本不需要发出任何诊断,程序在这种UB情况下“恰好”产生了“正确”的结果?