読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

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

VC++でもそうなった

以下のコードを見てみましょう。

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

int main() {
  const int *p;
  foo f(p);
  return 0;
}

コンパイル通ります。constなポインタは非constなポインタを取るコンストラクタに渡せませんが、bool値には暗黙に変換されるので何事もなかったかのようにコンパイル通ってしまうんですね。戻りビッ値先生がこの仕様のせいで3時間程バグに悩まされたそうです。「コンパイルエラーになれよ!」という心の叫びを聞きました。
因みにVC++先生はこのコードに対して警告をくれましたよ。

warning C4800: 'const int *' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)