在指定的返回值上使用std :: move以确保不进行复制吗?

问题描述 投票:0回答:1

考虑

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++ move-semantics rvalue-reference
1个回答
0
投票

此问题未标记有特定的C ++版本,所以我将就C ++ 17进行回答

在C ++ 17中,在这种情况下可以保证NVRO。 std::move不会执行任何操作,或者实际上会损害该标准的任何版本,因此您不应返回移动的对象。因此,在函数中声明的实际对象将是所使用外部范围中的确切对象。

© www.soinside.com 2019 - 2024. All rights reserved.