C 20 では、クラス テンプレート コンストラクターに冗長なテンプレート パラメーター リストを含めることはできますか?
C 17 では、クラス テンプレート コンストラクターを宣言することが許可されていました。次のコードで例示されるように、冗長なテンプレート パラメータ リストを使用します:
しかし、C 20 の出現と互換性変更の実装により、前述のコードは GCC トランク ( -std=c 20)。一方、Clang トランクは問題なくコードをコンパイルします。この矛盾により、次のような疑問が生じます。これはバグですか、それともコンパイラ間でまだ完全に実装されていない意図された重大な変更ですか?
答え
答えは次のとおりです。 C 20 仕様の微妙な変更。具体的には、次のセクションが改訂されました:
[class.ctor]
「コンストラクターは、宣言子が次の形式の関数宣言子である宣言によって導入されます。
ここで、ptr 宣言子は id 式、オプションの属性指定子シーケンス、およびオプションの周囲の括弧のみで構成され、id 式は次のいずれかの形式になります。"
クラス テンプレート内のメンバー宣言の場合、id 式はすぐに囲んでいるエンティティの挿入されたクラス名でなければなりません。
したがって、C 17 では S
したがって、-std=c 20 を使用した GCC トランクで発生したエラーはバグではなく、破壊的な問題を示しています。 C 20 で導入された変更。この変更をまだ実装していないコンパイラは引き続き古いコードを正常にコンパイルしますが、この変更を実装しているコンパイラは新しい要件に準拠します。
以上がC 20 クラス テンプレート コンストラクターは、冗長なテンプレート パラメーター リストを省略できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。