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

编辑:最终目标:即使可用,我想制作一个从不使用移动的容器类. NonMove是该容器的一类测试对象.

我尝试了不同的变化,但GCC坚持要使用move.

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;
   ^

End goal: I want to make a container class that never uses [move], even when it’s available. NonMove is a class of test objects for that container.

您的类不一定有助于实现您的目标,因为删除移动构造函数意味着该类型不是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);
}
代码日志版权声明:
翻译自:http://stackoverflow.com/questions/25662903/how-do-i-return-a-non-movable-but-copyable-object

转载注明原文:c++ 如何返回不可移动(但可复制)的对象?