
項目 23:std::move と std::forward を理解する
|
165
Widget(Widget&& rhs)
: s(std::move(rhs.s))
{ ++moveCtorCalls; }
…
private:
static std::size_t moveCtorCalls;
std::string s;
};
std::forward を用い同じ動作を実装すると、次のようになります。
class Widget {
public:
Widget(Widget&& rhs) // unconventional,
: s(std::forward<std::string>(rhs.s)) // undesirable
{ ++moveCtorCalls; } // implementation
一般的でなく望ましくも
ない実装
…
};
まず目を引くのは std::move には実引数 1 つだけを与えれば済むのに対し(rhs.s)、std::
forward では実引数(rhs.s)に加えテンプレートの型実引数(std::string)も与えなければなら
ない点です。次に目を引くのは、渡す実引数が右辺値であるという情報を組み込む際の慣例として、
std::forward へ渡すのは非参照型とする点です(項目 28 を参照)。この 2 点を合わせると、std::
move の方が std::forward よりも入力タイプ量が少なく済み、実引数が右辺値であることを示す情
報を内包した型実引数を与える際の問 ...