众所周知(或应该是)将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场景中产生“正确”结果?
答案 0 :(得分:6)
是UB。 libc ++不会以任何方式保护您。