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

Tho*_*mas 17 c++ move

编辑:结束目标:我想创建一个永远不会使用移动的容器类,即使它可用.NonMove是该容器的一类测试对象.

我尝试了不同的变化,但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();
}
Run Code Online (Sandbox Code Playgroud)

使用-std = gnu ++ 11时GCC 4.9.1出错

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;
   ^
Run Code Online (Sandbox Code Playgroud)

Jon*_*ely 15

最终目标:我想创建一个永远不会使用[move]的容器类,即使它可用.NonMove是该容器的一类测试对象.

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

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

NonMove foo() {
  return const_cast<const NonMove&&>(NonMove());
}
Run Code Online (Sandbox Code Playgroud)

如果RHS是移动构造函数则不可行const.

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

NonMove foo() {
  NonMove nm;
  return nm;
}
Run Code Online (Sandbox Code Playgroud)

添加const确保将被复制:

NonMove foo() {
  NonMove nm;
  return const_cast<const NonMove&>(nm);
}
Run Code Online (Sandbox Code Playgroud)