簡體   English   中英

如何返回不可移動(但可復制)的對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM