文字列リテラルが関数のオーバーロードで `bool` オーバーロードをトリガーするのはなぜですか?

Patricia Arquette
リリース: 2024-11-02 13:47:30
オリジナル
298 人が閲覧しました

Why does a string  literal trigger the `bool` overload in function overloading?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!