众所周知(或者应该是)绑定(bind) std::min
的结果到 const
引用是一个非常糟糕的主意,每当 std::min
的参数之一时是右值,因为 const
引用绑定(bind)不会通过函数返回传播。所以下面的代码
#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
悬空。事实上,在使用 -Wall -O3
使用 gcc5.2 进行编译时编译器吐了
warning:
<anonymous>
is used uninitialized in this function [-Wuninitialized]
但是,使用相同的标志(甚至包括 -Wextra
)用 clang (llvm 7.0.0) 编译不会发出任何警告,程序似乎“工作”,即显示 41
.
问题: clang 使用的是 std::min
的“安全”版本吗? ?就像使用某些 SFINAE 在其中一个参数是右值时按值返回的版本一样?还是根本不需要发出任何诊断信息并且程序“碰巧”在这种 UB 场景中产生“正确”的结果?
最佳答案
是UB。 libc++ 不会以任何方式保护您免受此影响。
关于c++ - libc++ 中的 std::min 没有悬挂引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917800/