这个问题与Does this C++ static analysis rule make sense as is?有关,但有些不同。我现在已经实现了一个静态分析规则来查找函数返回其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.
答案 0 :(得分:1)
函数是否内联完全没有区别
任何临时的生命。绑定函数的返回值
就像你的f
(或std::min
)到具有局部范围的const引用一样
肯定的方式结束悬挂参考。但我没有看到哪里
有任何真正的危险,因为这不是你会做的事情
合理的代码,除非引用是长期存在的东西
第一名,例如:
T const& obj = std::min( myMap['x'], myMap['y'] );
除了在这种特殊情况下,局部变量将是值,而不是 引用。