考虑
class A; // Class with heap-allocated memory and 'sane' move constructor/move assignment.
A a_factory(/* some args to construct an A object */)
{
// Code to process args to be able to build an A object.
A a(// args); // A named instance of A, so would require non-guaranteed NRVO.
return std::move(a);
}
void foo()
{
A result = a_factory();
}
在这种情况下,C ++标准是否保证在构造result
对象时不会发生复制,即我们是否保证移动构造?
我确实了解显式std :: move在返回值上的缺点,例如在类A不可移动的情况下,即使在类中没有move构造函数,我们也无法对临时对象进行后期实现,并且无法获得0个副本。但是我的具体问题是-我来自严格的实时背景,并且该标准不能保证的NRVO的当前状态不理想。我确实知道C ++ 17使(未命名的)RVO成为强制性的2种具体情况,但这不是我的问题。
此问题未标记有特定的C ++版本,所以我将就C ++ 17进行回答
在C ++ 17中,在这种情况下可以保证NVRO。 std::move
不会执行任何操作,或者实际上会损害该标准的任何版本,因此您不应返回移动的对象。因此,在函数中声明的实际对象将是所使用外部范围中的确切对象。