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
template<typename T> struct S { S(); // CORRECT C++20 syntax };
根拠
この変更の理論的根拠は、単純なテンプレート ID の使用。挿入されたクラス名の明示的な使用を強制することで、コンパイラーは意図したコンストラクターをより正確に解決できます。
結論
C 20 のこの変更はバグではありません。ですが、むしろ、クラス テンプレートのコンストラクター宣言の明確さと正確さを強化するための意図的な破壊的変更です。これにより、以前の構文に依存する既存のコードとの互換性の問題が発生する可能性がありますが、最終的には C アプリケーションの全体的な安全性と信頼性が向上します。
以上がC 20 クラス テンプレート コンストラクターでの冗長なテンプレート パラメーターのリストは許可されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。