explicit復習

後輩にexplicitを説明してもすぐにはピンと来ない様子だったので、具体例を作った。

#include <iostream>

class A{
  private:
  int a;
  public:
  explicit A(int x): a(x) {}
  void print() const { std::cout<<a<<std::endl; }
};

void func(const A hoge){ hoge.print(); }

int main(){
  A b(0);
  func(b); // 普通の呼び出し方。
  func(4); // explicitが無いとこの呼び出しが通り、コーディングミスの温床になる。
}

このように型変換の話なので、1変数以外のコンストラクタにはexplicitは不要。当然、同クラスを引数に取るコンストラクタにも不要。