オーバーロードされた C の Print メソッドで「Hello World」が「True」として印刷されるのはなぜですか?

Linda Hamilton
リリース: 2024-11-14 11:05:02
オリジナル
184 人が閲覧しました

Why Does

オーバーロードされたメソッドの文字列リテラルのあいまいさ

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>
ログイン後にコピー

次のように文字列リテラルを使用して Print メソッドを呼び出そうとすると、

<code class="cpp">Output::Print("Hello World");</code>
ログイン後にコピー

予期せず、出力は "Hello World" ではなく "True" になります。 」。なぜですか?

文字列リテラルとユーザー定義の変換

C では、「Hello World」のような文字列リテラルは std::string 型ではなく、定数文字の配列です。ただし、暗黙的に bool 値に変換できます。 標準変換シーケンス として知られるこの変換は、コンパイラによって std::string のユーザー定義の変換コンストラクターよりも優先されます。

オーバーロードの解決と標準変換

オーバーロードの解決中に、コンパイラは各引数に対して呼び出す最適な関数を決定します。ユーザー定義の変換よりも標準の変換シーケンスが優先されます。この例では、"Hello World" から bool への標準変換が、ユーザー定義の std::string への変換よりも優れていると考えられます。

曖昧さを避ける方法

std が確実に::string オーバーロードが使用されているため、std::string 引数を明示的に渡す必要があります:

<code class="cpp">Output::Print(std::string("Hello World"));</code>
ログイン後にコピー

これにより曖昧さが解決され、「Hello World」が正しく出力されます。

結論

C では、暗黙的な変換とそれがオーバーロード解決に与える影響を理解することが重要です。デフォルトでは、標準変換がユーザー定義変換より優先されます。したがって、予期しない動作を避けるために、そのような変換に注意し、必要に応じて明示的な型変換を行うことが重要です。

以上がオーバーロードされた C の Print メソッドで「Hello World」が「True」として印刷されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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