gpt4 book ai didi

c++ - 与 const 引用关联的临时对象的生命周期(方法链接)

转载 作者:可可西里 更新时间:2023-11-01 16:38:43 27 4
gpt4 key购买 nike

考虑以下代码片段:

#include <iostream>

struct S {
~S() { std::cout << "dtor\n"; }
const S& f(int i) const { std::cout << i << "\n"; return *this; }
};

int main() {
const S& s = S();
s.f(2);
}

Output :

2
dtor

即对象生命周期通过引用扩展,这在 Herb 的 article 中有解释。 .

但是,如果我们只更改一行代码并写成:

const S& s = S().f(1);

对已销毁的对象调用 f(2):

Output :

1
dtor
2

为什么会这样? f() 的返回值不是正确的“时间性”类型吗?

最佳答案

当你这样写一个函数时......

const S& f(int i) const { std::cout << i << "\n"; return *this; }

...您指示编译器返回 const S& 并且您负责确保引用的对象具有适合调用者使用的生命周期。 (“确保”可能构成记录适合您的设计的客户端使用情况。)

通常 - 将代码典型地分离为头文件和实现文件 - f(int) const 的实现甚至对调用代码不可见,在这种情况下编译器没有洞察力关于哪个S可能返回一个引用,也不知道那个S是不是临时的,所以它没有依据来决定是否需要延长生命周期.

除了显而易见的选项(例如,信任客户端编写安全代码、按值或智能指针返回)之外,还有一个更晦涩的选项值得了解...

const S& f(int i) const & { ...; return *this; }
const S f(int i) const && { ...; return *this; }

函数体重载 f 之前的 &&& 使得 && 版本被使用,如果*this 是可移动的,否则使用 & 版本。这样,将 const & 绑定(bind)到调用过期对象的 f(...) 的人将绑定(bind)到该对象的新拷贝,并根据本地 const 引用,而当对象尚未过期(尚未)时,const 引用将指向原始对象(只要引用 - 需要谨慎)。

关于c++ - 与 const 引用关联的临时对象的生命周期(方法链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336863/

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