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

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

Barbara Streisand
リリース: 2024-11-02 06:53:02
オリジナル
888 人が閲覧しました

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

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