gpt4 book ai didi

C++ 标准 : return by copy to initialize a reference without RVO: is there any copy?

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

让我们考虑下一个示例:

struct big_type {};

// Return by copy
auto factory() { return big_type{}; }

void any_scope_or_function() {
big_type&& lifetime_extended = factory();
}

假设 RVO 被禁止或根本不以任何方式存在,big_type() 是否会或可以被复制?还是将引用直接绑定(bind)到 return 语句中构造的临时对象?

我想确保 big_type 析构函数仅在 any_scope_or_function 结束时被调用一次。

我使用 C++14,以防某些行为在标准版本之间发生变化。

最佳答案

假设没有RVO/copy elison然后在

auto factory() { return big_type{}; }

big_type{} 将创建一个临时的 big_type。然后,该对象将用于复制初始化函数返回的对象。这意味着您在函数中创建的对象将被构造和析构。

big_type&& lifetime_extended = factory();

右值引用将延长函数返回的生命周期,因此我们将总共看到一个默认构造函数调用、一个复制/移动构造函数调用和两个析构函数调用。

现在,如果我们改变

auto factory() { return big_type{}; }

big_type factory() { return {}; }

然后我们不再在工厂中创建对象。返回对象直接用 {} 初始化,总共给我们一个默认的构造函数调用和一个析构函数调用

关于C++ 标准 : return by copy to initialize a reference without RVO: is there any copy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44788032/

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