编辑:结束目标:我想创建一个永远不会使用移动的容器类,即使它可用.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)
| 归档时间: |
|
| 查看次数: |
1326 次 |
| 最近记录: |