众所周知(或应该),将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