[英]How do I return a non-movable (but copyable) object?
編輯:結束目標:我想創建一個永遠不會使用移動的容器類,即使它可用。 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();
}
使用-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;
^
最終目標:我想創建一個永遠不會使用[move]的容器類,即使它可用。 NonMove是該容器的一類測試對象。
您的類不一定有助於實現您的目標,因為刪除移動構造函數意味着類型不是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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.