【发布时间】:2015-10-03 00:50:55
【问题描述】:
众所周知(或者应该是)将std::min 的结果绑定到const 引用是一个非常糟糕的主意,只要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;
}
应该产生未定义的行为,因为r 是悬空的。事实上,当使用-Wall -O3 使用 gcc5.2 进行编译时,编译器会吐出
警告:
<anonymous>在此函数中未初始化 [-Wuninitialized]
但是,使用相同标志(甚至包括 -Wextra)使用 clang (llvm 7.0.0) 编译不会发出任何警告,并且程序似乎“工作”,即显示 41。
问题:clang 是否使用“安全”版本的std::min?就像一个版本,只要其中一个参数是右值,就使用一些 SFINAE 按值返回?还是根本不需要发出任何诊断信息并且程序“发生”在这种 UB 场景中产生“正确”的结果?
【问题讨论】:
-
未定义行为未定义...
-
@T.C.是的,我知道,clang 是否解决了这个问题只是好奇,因为这是一个众所周知的问题,并且不会发出任何警告。
标签: c++ reference clang++ libc++ object-lifetime