2015-10-03 89 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 - 它似乎工作正常。 –