C での文字列リテラルと Bool オーバーロードの解決
C では、オーバーロードされたメソッドを使用して、同じ名前で異なるパラメーターを持つ複数のメソッドを定義できます。種類。ただし、実行する正確なオーバーロードを見つけることは、時には予期せぬことのように思えるかもしれません。特定の場合に文字列リテラルが 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>
Output::Print を呼び出したとき「Hello World」の場合、文字列リテラルが出力されることが期待できます。ただし、驚くべきことに、True が出力されます。これは、内部で暗黙的な変換が行われるために発生します。
C では、「Hello World」などの文字列リテラルの型は「12 個の const 文字の配列」です。これらは暗黙的に「const char へのポインタ」に変換でき、さらに暗黙的に bool に変換できます。この標準変換シーケンスは、文字列リテラルを std::string に変換するユーザー定義の変換シーケンスよりも優先されます。
C 標準 (13.3.3.2/2) に従って、標準変換シーケンスの方が上位に指定されます。オーバーロード解決中はユーザー定義の変換シーケンスよりも優先されます。文字列リテラルから bool への変換は標準変換であるため、std::string 変換よりも優先され、Print(bool) オーバーロードが選択されます。
std::string オーバーロードが確実に行われるようにするには、呼び出された場合は、明示的に std::string 値を指定します:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
C では、混乱を避け、意図したオーバーロードが確実に実行されるように、これらの暗黙の変換とオーバーロード解決ルールを理解することが重要です。
以上がC では文字列リテラルが `std::string` オーバーロードではなく `bool` オーバーロードを呼び出すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。