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

时间:2014-11-24 04:51:59

标签: c++ return-value-optimization

this张贴说明

  

当无名的临时,未绑定任何引用时,将被移动   或者复制到同一个cv-unqualified类型的对象中   复制/移动被省略。当构建临时建筑时,它就是   直接在存储器中构造,否则它将被移动   或复制到。当无名临时是返回的参数时   声明,复制省略的这种变体称为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的Copy-Constructor C的复制构造函数

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

1 个答案:

答案 0 :(得分:3)

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

  

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

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