6

私は最近、次のようなクラスに出くわしました

class Foo {
public:
    Foo(std::string msg) {}
private:
    Foo(bool b) {}
};

このクラスのオブジェクトを作成しようとしていることに気付きました

Foo foo("blah");

Foo::Foo(bool)非公開であることを示すコンパイル エラーが発生します。どうやら、引数が実際の std::string でない場合、コンパイラはbool引数でコンストラクターを使用することを好みます。一方、プライベート コンストラクターが指定されていない場合、上記のコードは正常にコンパイルされます。

渡された引数の型がそれらのいずれにも適合しないにもかかわらずbool、「 -constructor 」が「 -constructor 」よりも優先されるのはなぜですか? stringこれは単なる定義の問題ですか、それとももっと深い意味と正当な理由があるのでしょうか?

4

1 に答える 1

7

その理由は、変換演算子の優先順位に関係しています。各呼び出しには暗黙的な変換が含まれます

  1. ポインタ ->std::string
  2. ポインタ ->bool

この場合、#1 はユーザー定義の変換で、#2 は言語/コンパイラ定義の変換です。ユーザー定義の変換は優先順位がはるかに低いため、他の変換が優先されます。

編集

これは、関連する優先順位チェックのより詳細な説明がある同様の質問です

C++ での変換の優先順位

于 2013-03-11T16:00:14.277 に答える