ホームページ  >  記事  >  バックエンド開発  >  「Output::Print(\"Hello World\")」 が \"Hello World\" ではなく \"True\" を出力するのはなぜですか?

「Output::Print(\"Hello World\")」 が \"Hello World\" ではなく \"True\" を出力するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-02 06:53:02800ブラウズ

Why does `Output::Print(

文字列リテラルのオーバーロードの競合: Bool と std::string

C では、異なるパラメーター型を受け入れるためにクラス メソッドをオーバーロードできます。予想される std::string オーバーロードではなく、ブール型オーバーロードと予期せず一致する可能性があります。

問題の説明:

次のように定義された Output クラスがあるとします。

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

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

Output::Print("Hello World ") の場合、出力結果は予期される "Hello World" ではなく "True" になります。

問題分析:

std::string オーバーロードを定義しましたが、「Hello World」は実際には暗黙的に bool に変換できる文字配列定数です。コンパイラは、ユーザー定義の std::string 変換コンストラクターよりもこの標準変換を優先します。

C 標準 (§13.3.3.2/2) によれば、標準の変換順序はユーザー定義の変換順序よりも優先されます。したがって、コンパイラは変換順序が優れている bool オーバーロードを選択します。

回避策:

std::string オーバーロードを明示的に呼び出すには、「Hello World」を std::string として明示的に渡す必要があります。

<code class="cpp">Output::Print(std::string("Hello World"));</code>

以上が「Output::Print(\"Hello World\")」 が \"Hello World\" ではなく \"True\" を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。