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