bool を使用した関数のオーバーロードにおける文字列リテラルの曖昧さ
bool 引数と std::string 引数の両方を受け入れるオーバーロードされたメソッドを定義する場合、開発者は次のような問題に遭遇する可能性があります。文字列リテラルを指定するときに予期しない動作が発生する。 std::string オーバーロードを呼び出す代わりに、bool オーバーロードが優先されます。
この動作を理解するには、次の状況を考慮してください。
<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; } }; Output::Print("Hello World");</code>
文字列リテラルを指定しているにもかかわらず、Print( ) bool オーバーロードを含むメソッドが呼び出されます。これは、C の文字列リテラルは暗黙的に bool 値に変換できるためです。具体的には、「Hello World」は const char* 配列であり、const char へのポインタとして解釈でき、暗黙的に bool に変換できます。この変換は標準の変換シーケンスとみなされます。
C は、ユーザー定義の変換 (std::string から bool への変換など) よりも標準の変換シーケンスを優先します。 C 標準 (§13.3.3.2/2) によれば、標準の変換シーケンスは常により優れた変換シーケンスであると考えられます。
この動作は、Print( ) メソッド:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
以上が文字列リテラルが関数のオーバーロードで `bool` オーバーロードをトリガーするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。