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

7
众所周知(或应该知道),将 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是悬空的,因此应该产生未定义的行为。实际上,在使用-Wall -O3编译时,使用gcc5.2编译器会输出以下警告信息:

warning: <anonymous> is used uninitialized in this function [-Wuninitialized]

然而,使用相同标志(甚至包括-Wextra)编译器clang(llvm 7.0.0)不会发出任何警告,并且程序似乎“工作正常”,即显示41
问题:clang是否使用了“安全”的版本的std::min?例如,使用某些SFINAE在其中一个参数为rvalue时返回值的版本?还是根本不需要发出任何诊断,程序在这种UB情况下“恰好”产生了“正确”的结果?

1
未定义行为是未定义的... - T.C.
@T.C. 是的,我知道,只是好奇clang是否修复了这个问题,因为这是一个众所周知的问题,而且不会发出任何警告。 - vsoftco
1个回答

6

这是UB(未定义行为)。libc++在任何情况下都无法保护您免受此类问题的影响。


1
这是最恶劣的未定义行为 - 它看起来工作正常。 - Marshall Clow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接