ホームページ >バックエンド開発 >C++ >C コードが「Hello World」ではなく「True」を出力するのはなぜですか?

C コードが「Hello World」ではなく「True」を出力するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 03:51:02467ブラウズ

Why Does My C   Code Print

std::string の代わりにブール型オーバーロードに一致する文字列リテラル

次の C コードを考えてみましょう。

<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>

次のようにメソッドを呼び出すと:

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

出力を見て驚くかもしれません:

True

なぜ標準メソッドの代わりに Print メソッドのブール型オーバーロードが呼び出されたのですか: :string overload?

変換メカニズムを理解する

「Hello World」などの C の文字列リテラルは、const 文字の配列として格納されます。ただし、これらは const 文字へのポインタに暗黙的に変換でき、その後 bool に変換できます。

提供されたコードでは、コンパイラは、ユーザーの文字列よりも "Hello World" から bool への標準変換シーケンスを優先します。 「Hello World」から std::string への変換シーケンスを定義しました。この設定は、標準の変換シーケンスがユーザー定義の変換シーケンスよりも優先されることを規定する C 標準に基づいています。

問題の解決

標準::string オーバーロードが呼び出され、明示的に std::string 引数を渡します:

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

これにより、コンパイラに std::string オーバーロードの使用を強制することになり、「Hello World」が正しく出力されます。 .

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

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