C++クイズ explicitコンストラクタ編
先輩から以下のような問題を出された。
【問題】
class MyClass {
public:
MyClass(int m_):m(m_) {} ;
private:
int m;
};
のようなクラスがある場合、MyClass m1(0); // A
MyClass m2 = 0; // B
どっちの初期化もできちゃうよ。
この2つの違いはなーに?
どっちかしか使えない状況はある?
Aの場合は、普通にM(int m_)のコンストラクタが呼ばれて初期化が行われる。
Bの場合も、結果としては同じだけど、おそらく以下のような手順で初期化が行われる。
- 右辺値が一度 "M(0)" にキャストされ、
- private変数のmが0で初期化されたMクラスのインスタンスが生成され、
- 生成されたインスタンスが、Mクラスのデフォルトコピーコンストラクタでm2にコピーされる
M(int m_)のコンストラクタにexplicit宣言をつけた場合、Mのケースだとコンストラクタを明示しないといけないので、コンパイルエラーになるという話でいいんだろうか?