为什么返回值优化在这里发生

Why is return value optimization happening here

本文关键字:在这里 优化 返回值 为什么      更新时间:2023-10-16

从这篇文章中它说

当一个无名的临时的,不绑定到任何引用,将被移动 或复制到相同 CV 非限定类型的对象中, 省略复制/移动。当构造该临时时,它是 直接在存储中构建,否则它将被移动 或复制到。当无名临时是返回的参数时 语句,这种复制 elision 的变体称为 RVO,"返回值 优化"。

因此,为了测试这个概念,我尝试了以下实验。

class C
{
    public:
        C()
        {
            std::cout << "Constructor of C." << std::endl;
        }
        C(const C &)
        {
            std::cout << "Copy-constructor of C." << std::endl;
        }
};
C func()
{
    const C c;
    return c; //c is not a nameless and is not CV unqualified as it is a const type. 
}
int main(int argc, char **argv)
{
    C c = func();
}

输出:C 的构造器

我期待:C 的构造函数C 的复制构造函数C 的复制构造函数

我的问题是为什么这里会发生返回值优化?

因为你引用了一个不相关的段落。相关的是上面的一个(来自同一来源):

如果函数按值返回类类型,并且 return 语句的表达式是具有自动存储持续时间的非易失性对象的名称,该对象不是函数参数或 catch 子句参数,并且与函数的返回类型具有相同的 cv 非限定类型,则省略复制/移动。

任何规定的条件都允许复制省略。