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 ) を適用できない.
- > 式が左辺値か右辺値かでのディスパッチが必要になる.