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