【问题标题】:No dangling reference for std::min in libc++libc++ 中的 std::min 没有悬空引用
【发布时间】: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 进行编译时,编译器会吐出

警告:&lt;anonymous&gt; 在此函数中未初始化 [-Wuninitialized]

但是,使用相同标志(甚至包括 -Wextra)使用 clang (llvm 7.0.0) 编译不会发出任何警告,并且程序似乎“工作”,即显示 41

问题:clang 是否使用“安全”版本的std::min?就像一个版本,只要其中一个参数是右值,就使用一些 SFINAE 按值返回?还是根本不需要发出任何诊断信息并且程序“发生”在这种 UB 场景中产生“正确”的结果?

【问题讨论】:

  • 未定义行为未定义...
  • @T.C.是的,我知道,clang 是否解决了这个问题只是好奇,因为这是一个众所周知的问题,并且不会发出任何警告。

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


【解决方案1】:

它是UB。 libc++ 不会以任何方式保护您。

【讨论】:

  • 这是最讨厌的 UB - 它似乎工作正常。
猜你喜欢
  • 2021-10-10
  • 2016-02-23
  • 2017-11-17
  • 1970-01-01
  • 2017-04-10
  • 2017-01-16
  • 2015-07-15
  • 1970-01-01
  • 2018-01-01
相关资源
最近更新 更多