ゆとりーなの日記

日記的な事を書いて行くと思はれる

explicitって

昨日の記事の感想と思われるものに、「explicit付けても駄目なのか」っていうのが結構あったみたいなんですが、あの暗黙の変換の問題とexplicitは然程関係ないとおもんですがいかかでしょう。
もともとexplicitはコンストラクタの引数の型からそのクラスの型を生成することの抑止な筈なので、引数間の暗黙の変換を抑止するという機能は元々なかったような気がします。
以下サンプルです。

class foo {
public:
  explicit foo(bool) {}
  explicit foo(int *) {}
};

class hage {
public:
  hage(bool) {}
  hage(int *) {}
};

void foo_func(foo f) {
}

void hage_func(hage h) {
}

int main() {
  const int *p;
  foo f(p);
  foo_func(p); // コンパイルエラー
  foo_func(foo(p));
  hage_func(p); 
  return 0;
}

これが全てを表しているはずです。