Vik*_*ehr 2 c++ constructor move-constructor copy-elision c++11
是否允许C++编译器替换:
const auto myType = MyType(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
有:
const MyType myType(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
即,发出任务,或有什么可以防止这种情况?
注意:我问的原因是我更喜欢第一个版本.
是的,当满足某些条件时,允许实现省略类对象的复制/移动构造,它被称为复制省略.
在下列情况下,即使复制/移动构造函数和析构函数具有可观察的副作用,也允许编译器省略类对象的复制和移动构造函数.
对于你的代码,
如果函数按值返回类类型,并且return语句的表达式是具有自动存储持续时间的非易失性对象的名称,该对象不是函数参数或catch子句参数,并且具有相同的类型(忽略顶级cv资格)作为函数的返回类型,然后省略复制/移动.构造该本地对象时,它直接在存储器中构造,否则将移动或复制函数的返回值.复制省略的这种变体被称为NRVO,"命名返回值优化".
请注意,仍然需要访问复制/移动ctor.
即使发生了复制省略并且未调用复制/移动构造函数,它也必须存在并且可访问(就好像根本没有进行优化),否则程序就会形成错误.