在libc ++中没有std :: min的悬空引用

时间:2015-10-03 00:50:55

标签: c++ reference clang++ libc++ object-lifetime

众所周知(或应该是)将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悬空。事实上,当使用gcc5.2与-Wall -O3进行编译时,编译器会吐出

  

警告:<anonymous>在此函数中未初始化使用[-Wuninitialized]

但是,使用相同的标志(甚至包括-Wextra)使用clang(llvm 7.0.0)进行编译时不会发出任何警告,并且程序似乎“正常”,即显示41

问题:clang是否使用std::min的“安全”版本?就像一个版本,当一个参数是一个rvalue时,它使用一些SFINAE来按值返回?或者它是否根本不需要发出任何诊断并且程序“发生”以在此UB场景中产生“正确”结果?

1 个答案:

答案 0 :(得分:6)

是UB。 libc ++不会以任何方式保护您。