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

No dangling reference for std::min in libc++

本文关键字:min 引用 std libc++      更新时间:2023-10-16

众所周知(或者应该是),当std::min的一个参数是右值时,将std::min的结果绑定到const引用是一个非常糟糕的主意,因为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]

然而,用clang (llvm 7.0.0)编译使用相同的标志(甚至包括-Wextra)不会发出任何警告,程序似乎"工作",即显示41

问题: clang是否使用std::min的"安全"版本?就像一个版本,使用一些SFINAE返回值每当一个参数是右值?或者只是不需要发出任何诊断,程序"碰巧"在此UB场景中产生"正确"的结果?

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