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

vso*_*tco 6 c++ reference object-lifetime clang++ libc++

众所周知(或应该)是结合的结果std::minconst参考是一个非常糟糕的主意,每当其中一个参数std::min是右值,因为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;
}
Run Code Online (Sandbox Code Playgroud)

应该产生未定义的行为,因为r悬空.事实上,当使用gcc5.2编译时使用-Wall -O3编译器吐出

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

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

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

How*_*ant 6

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