是否允许C ++编译器仅使用构造替换construct + moveconstruct?

时间:2016-05-27 08:40:13

标签: c++ c++11 constructor move-constructor copy-elision

是否允许C ++编译器替换:

const auto myType = MyType(1, 2, 3);

使用:

const MyType myType(1, 2, 3);

即,发出作业,还是有什么可以防止这种情况?

注意: 我问的原因是我更喜欢第一个版本。

1 个答案:

答案 0 :(得分:5)

是的,允许实现省略类的复制/移动构造 对象在满足某些条件时,称为copy elision

  

在以下情况下,允许编译器省略   类对象的复制和移动构造函数,即使复制/移动也是如此   构造函数和析构函数具有可观察到的副作用。

对于您的代码,

  

如果函数按值返回类类型,则返回   statement的表达式是一个非易失性对象的名称   自动存储持续时间,不是函数参数,或者是   catch子句参数,它具有相同的类型(忽略   顶级cv-qualification)作为函数的返回类型,然后   复制/移动被省略。当构造该本地对象时,它就是   直接在存储中构造函数的返回值   否则将被移动或复制到。复制省略的这种变体是   被称为NRVO,“命名返回值优化”。

请注意,仍然需要访问复制/移动ctor。

  

即使发生了复制省略并且没有调用copy- / move-构造函数,它也必须存在并且可访问(好像根本没有进行优化),否则程序就会格式不正确。