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

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

Mary-Kate Olsen
リリース: 2024-11-03 03:51:02
オリジナル
470 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート