编辑:结束目标:我想制作一个永远不会使用移动的容器类,即使它可用。 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;
^
答案 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);
}