ホームページ >バックエンド開発 >C++ >C 20 クラス テンプレート コンストラクターは、冗長なテンプレート パラメーター リストを省略できますか?

C 20 クラス テンプレート コンストラクターは、冗長なテンプレート パラメーター リストを省略できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-19 15:12:03400ブラウズ

Can C  20 Class Template Constructors Omit Redundant Template Parameter Lists?

C 20 では、クラス テンプレート コンストラクターに冗長なテンプレート パラメーター リストを含めることはできますか?

C 17 では、クラス テンプレート コンストラクターを宣言することが許可されていました。次のコードで例示されるように、冗長なテンプレート パラメータ リストを使用します:

しかし、C 20 の出現と互換性変更の実装により、前述のコードは GCC トランク ( -std=c 20)。一方、Clang トランクは問題なくコードをコンパイルします。この矛盾により、次のような疑問が生じます。これはバグですか、それともコンパイラ間でまだ完全に実装されていない意図された重大な変更ですか?

答え

答えは次のとおりです。 C 20 仕様の微妙な変更。具体的には、次のセクションが改訂されました:

[class.ctor]

「コンストラクターは、宣言子が次の形式の関数宣言子である宣言によって導入されます。

ここで、ptr 宣言子は id 式、オプションの属性指定子シーケンス、およびオプションの周囲の括弧のみで構成され、id 式は次のいずれかの形式になります。"

クラス テンプレート内のメンバー宣言の場合、id 式はすぐに囲んでいるエンティティの挿入されたクラス名でなければなりません。

したがって、C 17 では S が許可されていましたが、 ;() をテンプレート S 内のコンストラクター宣言として使用する場合、C 20 では代わりに S() が必要です。この変更により、冗長性が効果的に削除され、潜在的なエラーが発生しやすい慣行に対処する CWG 2237 に準拠します。

したがって、-std=c 20 を使用した GCC トランクで発生したエラーはバグではなく、破壊的な問題を示しています。 C 20 で導入された変更。この変更をまだ実装していないコンパイラは引き続き古いコードを正常にコンパイルしますが、この変更を実装しているコンパイラは新しい要件に準拠します。

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

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