gpt4 book ai didi

c++ - 对临时对象的 const 引用在函数作用域(生命周期)后被破坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:51 26 4
gpt4 key购买 nike

在询问时this question ,我了解到对临时对象的 const 引用在 C++ 中是有效的:

int main ()
{
int a = 21;
int b = 21;

//error: invalid initialization of non-const reference
//int & sum = a + b;e [...]

//OK
int const & sum = a + b;

return sum;
}

但在下面的例子中,常量引用 refnop 指的是一个被销毁的临时对象。我想知道为什么?

#include <string>
#include <map>

struct A
{
// data
std::map <std::string, std::string> m;
// functions
const A& nothing() const { return *this; }
void init() { m["aa"] = "bb"; }
bool operator!= (A const& a) const { return a.m != m; }
};

int main()
{
A a;
a.init();

A const& ref = A(a);
A const& refnop = A(a).nothing();

int ret = 0;
if (a != ref) ret += 2;
if (a != refnop) ret += 4;

return ret;
}

使用 GCC 4.1.2 和 MSVC 2010 测试,返回 4;

$> g++ -g refnop.cpp
$> ./a.out ; echo $?
4

refrefnop 之间的区别在于对 nothing() 的调用实际上什么都不做。似乎在这个调用之后,临时对象被销毁了!

我的问题:
为什么在 refnop 的情况下,临时对象的生命周期与其 const 引用不同?

最佳答案

当临时对象绑定(bind)到第一个引用时,临时对象的生命周期扩展只能执行一次。之后,引用指向临时对象的知识消失了,因此不可能进一步延长生命周期。

让你不解的案例

A const& refnop = A(a).nothing();

类似这种情况:

A const& foo(A const& bar)
{
return bar;
}
//...
A const& broken = foo(A());

在这两种情况下,临时对象都绑定(bind)到函数参数(nothing() 的隐式 thisbar foo()) 并将其生命周期“延长”到函数参数的生命周期。我将“延长”放在引号中,因为临时的自然生命周期已经更长,所以不会发生实际延长。

因为生命周期扩展属性是不可传递的,返回一个引用(恰好引用一个临时对象)不会进一步延长临时对象的生命周期,结果 refnopbroken 最终指向不再存在的对象。

关于c++ - 对临时对象的 const 引用在函数作用域(生命周期)后被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17236007/

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