C标准:通过复制返回初始化没有RVO的引用:是否有任何副本?

让我们考虑下一个样本:

struct big_type {};

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

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

在假设RVO被禁止或根本不存在的情况下,是否会复制big_type()?或者引用是否直接绑定到return语句中构造的临时值?

我想确保在any_scope_or_function结束时只调用一次big_type析构函数.

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

最佳答案
假设没有RVO /拷贝elison

auto factory() { return big_type{}; }

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

big_type&& lifetime_extended = factory();

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

现在,如果我们改变

auto factory() { return big_type{}; }

big_type factory() { return {}; }

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

转载注明原文:C标准:通过复制返回初始化没有RVO的引用:是否有任何副本? - 代码日志