gpt4 book ai didi

c++ - 函数调用中临时对象的生命周期

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:42 24 4
gpt4 key购买 nike

请看下面的代码示例:

(一)

#include <iostream>
#include <utility>
struct wrapper {
int&& x;
};

void f(wrapper a) { std::cout << std::move(a.x) << std::endl; }
int g() { return 0; }

int main() {
f(wrapper{g()});
}

(乙)

#include <iostream>
#include <utility>
struct wrapper {
int&& x;
};
wrapper make_wrapper(int&& x) {
return{ std::move(x) };
}

void f(wrapper a) { std::cout << std::move(a.x) << std::endl; }
int g() { return 0; }

int main() {
f(make_wrapper(g()));
}

这些例子有效吗?也就是说,在 f 执行完成之前,由 g 创建的临时对象是否仍然存在?当 f 将其参数作为引用时会发生什么?

最佳答案

两个代码示例均有效。

在您的代码中创建的唯一临时文件是 intg() 返回, wrappermake_wrapper 返回和 wrapper通过 wrapper{...} 中的聚合初始化创建.

所有这些都发生在完整表达式的词汇上

f(wrapper{g()});

f(make_wrapper(g()));

并且通常临时对象的生命周期在创建它们的完整表达式的末尾结束。因此,在对 f 的调用中,您所有的临时对象都存活到相应行的末尾。 ,并且它们都不会在其生命周期之外使用。

此生命周期规则只有少数异常(exception),所有异常(exception)都会延长生命周期。事实上绑定(bind)临时intg() 返回到 int&&通过聚合初始化的子对象实际上将临时对象的生命周期延长到引用的生命周期。

因此

wrapper w{g()};

实际上不会有悬挂引用成员,即使在下面的语句中也是如此。

关于c++ - 函数调用中临时对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57845529/

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