ホームページ  >  記事  >  バックエンド開発  >  C では文字列リテラルが `std::string` オーバーロードではなく `bool` オーバーロードを呼び出すのはなぜですか?

C では文字列リテラルが `std::string` オーバーロードではなく `bool` オーバーロードを呼び出すのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-04 10:12:01788ブラウズ

Why does a string literal call a `bool` overload instead of a `std::string` overload in C  ?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。