gpt4 book ai didi

c++ - 使函数内联会影响绑定(bind)到其参数的临时对象的生命周期吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:09 25 4
gpt4 key购买 nike

这个问题与Does this C++ static analysis rule make sense as is?有关,但有些不同。我现在已经实现了一个静态分析规则来查找函数返回其常量引用参数作为引用的情况,例如

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

当临时对象绑定(bind)到 x 时,这可能很狡猾,因为临时对象的生命周期将在 f 的返回值可以绑定(bind)到调用者,召集者。换句话说,这是有问题的:

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;
}

这显然将其常量引用参数作为引用返回,但该函数是内联。这对临时生命周期有影响吗,或者这真的有点狡猾吗?该函数标有以下注释,因此显然可以在临时对象上调用它:

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

最佳答案

一个函数是否是内联的对任何临时对象的生命周期。绑定(bind)函数的返回值像你的 f(或 std::min)到一个局部作用域的 const 引用是一个以悬空引用结束的肯定方法。但我看不到哪里有任何真正的危险,因为这不是你会做的事情合理的代码,除非引用的是长期存在于第一名,例如:

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

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

关于c++ - 使函数内联会影响绑定(bind)到其参数的临时对象的生命周期吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11539521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com