[ノート]移動の意味と完璧な転送

1114 ワード

移動の意味と完璧な転送
std::move、std::forward
std::moveは変換を実行する関数テンプレートです.std::moveは無条件にそのパラメータを右値に変換します.std::move自体は何もmoveせず、実行可能なコードも生成しません.
std::forwardは変換を実行する関数テンプレートです.std::forwardパラメータが右にバインドされている場合に、そのパラメータを右に変換します.std::forwardは何も転送せず、実行可能なコードも生成しません.
class Widget
{
public:
	Widget(Widget&& rhs)
	: m_strName(std::move(rhs.m_strName)),
	p(std::move(rhs.p))
	{}
	
	void setName(const std::string& name)
	{
		m_strName = std::move(name);
	}
private:
   std::string m_strName;
   std::shared_ptr p;
};
  • Modern C++には、左と右の2つの値タイプがあります.
  • Modern C++には、左参照、右参照、汎用参照の3種類の参照タイプがあります.左参照は左のみバインドされ、右参照は右のみバインドされ、汎用参照は初期化時にバインドされた値のタイプによって決定されます.
  • の左値と右値は彼らのタイプとは独立しており、右値参照は左値である可能性があり、右値参照がすでに名前が付けられている場合、彼は左値である可能性があります.
  • 参照折り畳み規則:すべての右値参照が右値参照に重畳されても右値参照であり、他の参照折り畳みは左値参照である.T&&がテンプレートパラメータの場合、左の値を入力すると左の値が参照され、右の値を入力すると名前付きの右の値が適用されます.
  • モバイルセマンティックは、無意味なメモリコピーを減らすことができ、モバイルセマンティックを実現するには、モバイル構築関数とモバイル付与関数を実現する必要があります.
  • std::move()は左の値を右の値に変換し、移動コピーと付与関数を強制的に使用します.この関数自体はこの左の値に対して特別な操作はありません.