2013-03-11 5 views
5

私は最近、私はオーバーロードコンストラクタ - ブール引数を持つconstructurが優先

Foo foo("blah"); 

の原因により、このクラスのオブジェクトを作成しようとしていることに気づいた次

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

のようにクラスに出くわしましたFoo::Foo(bool)がプライベートであることを示すコンパイルエラー。明らかに、引数が実際のstd :: stringでない場合、コンパイラはbool引数を持つコンストラクタを使用することを推奨します。一方、プライベートコンストラクタが与えられていない場合、上記のコードはうまくコンパイルされます。

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

+0

わからない*関与優先チェックの深さの説明に多くを持っている同様の問題である理由*が、彼らは(おそらく)どちらも「明示的」であるべきです。 –

+0

実際には、明示的なキーワードは動作を変更しません – symphonic

+0

この場合はそうではありません。 –

答えて

7

理由は変換演算子の優先順位と関係があります。 >std::string

  • ポインタ - - コールのそれぞれは、暗黙的な変換

    1. ポインタ含み、この場合、#1で>bool

    をユーザ定義の変換及び#2が定義された言語/コンパイラであります1。ユーザー定義の変換は優先順位がはるかに低く、したがって他の変換が優先されます。ここを編集

    を約

    conversion precedence in c++

  • +0

    これはスペックどこか? – Nick

    +2

    @nickを付録B.2に見てください – JaredPar

    +1

    speckで標準を意味するならyes、それは**§13.3.3.2,2**にあります:暗黙の変換シーケンスの基本形式を比較するとき[...] - 標準変換シーケンス[...]はユーザ定義の変換よりも優れた変換シーケンスです シーケンス*( 'const char * - > bool'は標準変換シーケンスです) –