51

私はいくつかのオーバーロードされたメソッドを持つC++クラスを書き込もうとしています:

class Output
{
public:
    static void Print(bool value)
    {
        std::cout << value ? "True" : "False";
    }

    static void Print(std::string value)
    {
        std::cout << value;
    }
};

ここで、次のようにメソッドを呼び出したとしましょう。

Output::Print("Hello World");

これが結果です

では、なぜ、メソッドがブール値と文字列を受け入れることができると定義したときに、非ブール値を渡すときにブール値のオーバーロードを使用するのでしょうか。

編集:私はC#/ Java環境から来たので、C ++はまったく新しいです!

4

4 に答える 4

63

"Hello World"は、「12 の配列」型の文字列リテラルでありconst char、「へのポインタconst char」に変換でき、さらに に変換できますbool。それがまさに起こっていることです。コンパイラは、std::stringの変換コンストラクタを使用するよりもこれを優先します。

変換コンストラクターを含む変換シーケンスは、ユーザー定義の変換シーケンスと呼ばれます。"Hello World"からa への変換boolは、標準の変換シーケンスです。標準では、標準の変換シーケンスは常にユーザー定義の変換シーケンスよりも優れていると述べています (§13.3.3.2/2)。

標準の変換シーケンス (13.3.3.1.1) は、ユーザー定義の変換シーケンスまたは省略記号の変換シーケンスよりも優れた変換シーケンスです。

この「より良い変換シーケンス」分析は、実行可能な各関数の各引数に対して行われ (引数は 1 つしかありません)、より良い関数がオーバーロードの解決によって選択されます。

バージョンが呼び出されることを確認したい場合std::stringは、次のように指定する必要がありますstd::string

Output::Print(std::string("Hello World"));
于 2013-02-08T10:18:22.460 に答える