c++ - libc++ 中的 std::min 没有悬挂引用

标签 c++ reference clang++ libc++ object-lifetime

众所周知(或者应该是)绑定(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/

相关文章:

c# - C# 项目中的神秘 VBIDE 引用已损坏

java - 在Java中的方法调用中使用像指针一样的引用

multithreading - macosx 线程显式标记为已删除

C#:有什么方法可以轻松查找/更新对对象的所有引用?

c++ - g++ 编译器无法识别我的函数

c++ - 为什么编译器要为这个循环的每次迭代写入一个成员变量到内存中?

c++ - 如何获取哪个 QradioButton 调用 SLOT

c++ - ~0 是做什么的?

c++ - 包装一行预处理器 C++

c++ - 为什么允许 shared_ptr<T[N]>?