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