2014-11-24 31 views
0

this文章表示为什么返回值优化发生在这里

当一个无名临时的,不会绑定到任何引用,将被移动 或复制到相同的CV-不合格类型的对象时, 复制/移动被省略。当临时建造时,它是直接在存储中构建的 ,否则它将被移动 或复制到。当无名暂时是声明返回的参数时,这种副本删除的变体称为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

Constrcutor我期待: 的构造ç 拷贝构造的Ç C的复制构造函数

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

回答

2

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

如果函数返回由值的类型,和返回语句的表达是一种非挥发性的对象具有自动存储持续时间,其名称不是函数参数或catch子句参数,并且与函数的返回类型具有相同的cv-unqualified类型,则复制/移动将被省略。

任何的所述条件允许复制elision。

+0

这仍然不能回答它。返回类型是一个常量,所以它不是cv不合格的,并且返回类型也不是临时的。它在函数中创建并返回。 – MistyD 2014-11-24 04:57:07

+2

@MistyD:返回类型不是常量。你要返回的对象是。但无论如何,这是无关紧要的。该文本并不是说它需要cv不合格。它表示返回的对象的类型(除去了cv限定符)需要与该函数的返回类型相同(删除了cv限定符)。 – 2014-11-24 05:06:59

相关问题