ホームページ >バックエンド開発 >C++ >C 20 クラス テンプレート コンストラクターで冗長なテンプレート パラメーター リストが禁止されているのはなぜですか?

C 20 クラス テンプレート コンストラクターで冗長なテンプレート パラメーター リストが禁止されているのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-28 02:10:10333ブラウズ

Why Are Redundant Template Parameter Lists in C  20 Class Template Constructors Now Forbidden?

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

C 17 では、クラス テンプレート コンストラクターで次のことが許容されました。冗長なテンプレートパラメータリスト。例:

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

ただし、C 20 では、これは当てはまりません。最近の変更により、クラス テンプレートのすべてのコンストラクターで、挿入されたクラス名を使用することが義務付けられ、宣言子の冗長性が排除されています。

この変更は、C 20 ドラフトの互換性セクションに文書化されています。

[diff.cpp17.class]
**Affected subclauses**: [class.ctor] and [class.dtor]
**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.
**Effect on original feature**: Valid C++ 2017 code may fail to compile in this International Standard.

具体的には、コンストラクター宣言子の id 式は次のいずれかをとらなければなりません。フォーム:

  • クラスの非フレンド メンバー仕様内のメンバー宣言では、それを囲んでいるクラスの挿入クラス名。
  • 非フレンド メンバー仕様内のメンバー宣言では-friend クラス テンプレートのメンバー仕様、それを囲んでいるクラス テンプレートの現在のインスタンス化を命名するクラス名。

したがって、正しいC 20 のコンストラクター宣言は次のようになります:

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

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

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