4

这个问题与此 C++ 静态分析规则是否有意义?,但有些不同。我现在实现了一个静态分析规则来查找函数返回其 const 引用参数作为引用的情况,例如

const X& f(const X& x) { return x; }

当临时对象绑定到 时,这可能是不可靠的x,因为临时对象的生命周期将在 的返回值f可以绑定到调用者中的引用之前结束。换句话说,这将是有问题的:

const X& r = f(X());

在运行规则时,我min在标准库中找到了一个如下所示的实现:

template<typename _Tp>
inline const _Tp&
min(const _Tp& __a, const _Tp& __b)
{
  // concept requirements
  __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
  //return __b < __a ? __b : __a;
  if (__b < __a)
    return __b;
  return __a;
}

这清楚地将其 const 引用参数作为引用返回,但函数是inline. 这对临时寿命有影响吗,还是真的有点狡猾?该函数标有以下注释,因此它显然可以在临时对象上调用:

*  This is the simple classic generic implementation.  It will work on
*  temporary expressions, since they are only evaluated once, unlike a
*  preprocessor macro.
4

1 回答 1

1

函数是否内联对任何临时对象的生命周期都没有影响。f将像您的(or )这样的函数的返回值绑定std::min到具有本地范围的 const 引用是最终得到悬空引用的可靠方法。但我看不出哪里有任何真正的危险,因为这不是你在合理的代码中会做的事情,除非引用首先是长期存在的东西,例如:

T const& obj = std::min( myMap['x'], myMap['y'] );

除非在这种特殊情况下,局部变量将是值,而不是引用。

于 2012-07-18T10:53:07.997 回答