move をエミュレーションする上での限界

非const左辺値からの自動的な move return ができない.

  • > return 文に明示的に ai_a::move を指定しなければならない.

派生クラスの非const右辺値を自動的に基底クラスの右辺値参照オーバーロードにディスパッチすることができない.

  • > 派生・基底変換をcopyによって許容する場合

void f( Movable const &); // 従来の定義

は以下の4つのオーバーロードでエミュレートされる.

void f( Movable & ); // Movable のnon-const左辺値

void f( const_lvalue< Movable > ); // Movable のconst左辺値

void f( rvalue_reference< Movable > ); // Movable のnon-const右辺値

void f( conversion_rvalue_reference< Movable > ); // Movable に変換可能なクラスオブジェクトからの
// 暗黙の変換で生成された一時変数に対するnon-const右辺値参照




ai_a::move( exp );

-exp が非const左辺値 -> exp の非const右辺値参照
-exp がconst左辺値 -> exp のconst右辺値参照
-exp が非const右辺値 -> exp の非const右辺値参照
-exp がconst右辺値 -> exp のconst右辺値参照

右辺値が取れない -> 引数が左辺値か右辺値かが識別できない汎用文脈で ai_a::move( exp ) を適用できない.

  • > 式が左辺値か右辺値かでのディスパッチが必要になる.