ホームページ >バックエンド開発 >C++ >C 20 クラス テンプレート コンストラクターでの冗長なテンプレート パラメーターのリストは許可されますか?

C 20 クラス テンプレート コンストラクターでの冗長なテンプレート パラメーターのリストは許可されますか?

DDD
DDDオリジナル
2024-11-26 06:54:10816ブラウズ

Is Redundant Template Parameter Listing in C  20 Class Template Constructors Allowed?

C 20 のクラス テンプレート コンストラクターの冗長なテンプレート パラメーター リスト

冗長なテンプレート パラメーター リストを持つクラス テンプレート コンストラクターの有効性については、以来議論されてきました。 C 20 の導入。問題とその内容は次のとおりです。解決策:

C 17 では、以下のコードは整形式であると見なされていました:

template<typename T>
struct S {
    S<T>();
};

ただし、C 20 では、同じコードが一部のコンパイラ (gcc トランクなど) でエラーを引き起こします。 ) -std=c 20 の下:

error: expected unqualified-id before ')' token
    3 |     S<T>();
                 ^

C での変更20

C 20 標準では、クラス テンプレートのコンストラクター宣言の構文の変更が義務付けられています。標準の互換性セクションの次のデルタは、これを強調しています:

[diff.cpp17.class]

...

Change: A simple-template-id is no longer valid as the declarator-id of a constructor or destructor.
Rationale: Remove potentially error-prone option for redundancy.
...

本質的に、前のコードで使用されていた「冗長な」テンプレート パラメーター リスト S() は許可されなくなりました。代わりに、挿入されたクラス名 S を使用する必要があります。

template<typename T>
struct S {
    S(); // CORRECT C++20 syntax
};

根拠

この変更の理論的根拠は、単純なテンプレート ID の使用。挿入されたクラス名の明示的な使用を強制することで、コンパイラーは意図したコンストラクターをより正確に解決できます。

結論

C 20 のこの変更はバグではありません。ですが、むしろ、クラス テンプレートのコンストラクター宣言の明確さと正確さを強化するための意図的な破壊的変更です。これにより、以前の構文に依存する既存のコードとの互換性の問題が発生する可能性がありますが、最終的には C アプリケーションの全体的な安全性と信頼性が向上します。

以上がC 20 クラス テンプレート コンストラクターでの冗長なテンプレート パラメーターのリストは許可されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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