从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的复制构造函数
我的问题是为什么返回值优化会在这里发生?
答案 0 :(得分:3)
因为你引用了一个不相关的段落。相关的是上面的(来自同一来源):
如果函数按值返回类类型,并且return语句的表达式是具有自动存储持续时间的非易失性对象的名称,它不是函数参数或catch子句参数,与函数的返回类型具有相同的cv-nonqualified类型,则省略copy / move。
任何规定的条件允许复制省略。