首页 > 解决方案 > 在命名返回值上使用 std::move 来保证不复制?

问题描述

更新:更明确地说,避免误解:我要问的是,在返回命名值的情况下,C++17 标准是否保证如果我在 std::move 上执行移动构造函数将被调用返回值?我知道如果不使用 std::move,编译器是允许但不是必需的,完全省略复制和移动构造函数,直接在调用函数中构造返回值。在我的示例中,这不是我想要做的,我想要保证。

考虑

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 不可移动的情况下,即使类中没有移动构造函数,我们也无法进行临时对象的后期实现并获得 0 副本。但我的具体问题是——我来自硬实时背景,并且目前没有得到标准保证的 NRVO 状态并不理想。我确实知道 C++17 强制(未命名)RVO 的 2 个特定情况,但这不是我的问题。

标签: c++move-semanticsrvalue-reference

解决方案


推荐阅读