
項目 27:ユニヴァーサル参照をとるオーバロードの代替策を把握する
|
187
SpecialPerson(const SpecialPerson& rhs) // copy ctor; calls
: Person(rhs) // base class
{ … } // forwarding ctor!
コピーコンストラクタ。基
底クラスの転送コンストラ
クタを呼び出す!
SpecialPerson(SpecialPerson&& rhs) // move ctor; calls
: Person(std::move(rhs)) // base class
{ … } // forwarding ctor!
};
ムーブコンストラクタ。基
底クラスの転送コンストラ
クタを呼び出す!
コメントにもあるように、派生クラスのコピー/ムーブコンストラクタは基底クラスのコピー/
ムーブコンストラクタを呼び出さず、基底クラスの完全転送コンストラクタを呼び出すのです! そ
の理由を考えてみましょう。まず、派生クラスでは SpecialPerson 型の実引数を基底クラスへ渡し
ます。次に、Person のコンストラクタのテンプレートをインスタンス化し、オーバロードを解決し
ます。ここで、SpecialPerson をとる std::string コンストラクタなど存在しないため、最終的
にコンパイルできません。
ここまでで、ユニヴァーサル参照を仮引数にとるオーバロードとは、可能な限り避けるべきもの
であると納得されたことを願います。し ...