如何返回不可移动(但可复制)的对象?

时间:2014-09-04 10:17:23

标签: c++ move

编辑:结束目标:我想制作一个永远不会使用移动的容器类,即使它可用。 NonMove是该容器的一类测试对象。<​​/ p>

我尝试了不同的变体,但GCC坚持要使用移动。

class NonMove {
 public:
  NonMove() {}

  // Copy.
  NonMove(const NonMove&) {}
  NonMove& operator=(const NonMove&) {}

  // Move
  NonMove(NonMove&&) = delete;
  NonMove& operator=(NonMove&&) = delete;
};

NonMove foo() {
  return NonMove();
}

GCC 4.9.1与-std = gnu ++ 11

出错
move.cc: In function ‘NonMove foo()’:
move.cc:15:18: error: use of deleted function ‘NonMove::NonMove(NonMove&&)’
   return NonMove();
                  ^
move.cc:10:3: note: declared here
   NonMove(NonMove&&) = delete;
   ^

1 个答案:

答案 0 :(得分:15)

  

结束目标:我想创建一个永远不会使用[move]的容器类,即使它可用。 NonMove是该容器的一类测试对象。<​​/ p>

您的类不一定有助于实现您的目标,因为删除移动构造函数意味着类型不是CopyConstructible,因此不能用于准确测试仅复制的容器。

为防止移动,您可以确保使用const源对象完成所有可能的副本或移动:

NonMove foo() {
  return const_cast<const NonMove&&>(NonMove());
}

如果RHS为const,那么移动构造函数是不可行的。

通常只需确保RHS是左值,因为它也不会被移动,但是函数返回值有一个特殊情况,即使它们是左值也可以移动,这意味着如果它存在,这将尝试使用移动构造函数:

NonMove foo() {
  NonMove nm;
  return nm;
}

添加const可确保将其复制:

NonMove foo() {
  NonMove nm;
  return const_cast<const NonMove&>(nm);
}