ホームページ  >  記事  >  バックエンド開発  >  C では、暗黙的な型変換中にユーザー定義変換が 1 つだけ許可されるのはなぜですか?

C では、暗黙的な型変換中にユーザー定義変換が 1 つだけ許可されるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-01 01:14:28539ブラウズ

Why Does C   Allow Only One User-Defined Conversion During Implicit Type Conversions?

C 暗黙的な変換: ユーザー定義の変換ルールを理解する

以前の応答に対する最近のフィードバックを考慮すると、理解を明確にすることが重要です

次のコード スニペットを考えてみましょう:

<code class="c++">#include <string>

struct A {
    A(const std::string &s) {}
};

void func(const A &a) {
}

int main() {
    func("one"); // error
    func(A("two")); // ok
    func(std::string("three")); // ok
}</code>

const char* から A への直接変換がないため、最初の関数呼び出しではエラーが発生します。文字列から A への変換がありますが、これを適用するには複数の変換が必要となり、これは許可されていません。

C 標準 (SC22-N-4411.pdf) のセクション 12.3.4 に答えが記載されています。タイトル 'Conversions':

"4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value."

これは、暗黙的な型変換または初期化中に 1 つの値に適用できる暗黙的なユーザー定義変換 (コンストラクターまたは変換関数) は 1 つだけであることを意味します。

指定されたコードでは、最初の関数呼び出し func("one") は const char* "one" から A への暗黙的な変換を使用しようとしますが、これには 2 つの変換 (const char から 1 つ) が必要なため失敗します。 * から std::string へ、もう 1 つは std::string から A)。他の 2 つの関数呼び出しは、暗黙的な変換がそれぞれ 1 つだけ含まれるため、有効です。

以上がC では、暗黙的な型変換中にユーザー定義変換が 1 つだけ許可されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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