同じ整数値の列挙型でテンプレートを特殊化することは許可されていますか?

ゲーザ

この単純なスニペットを見てください:

enum class Enum1 { Value };
enum class Enum2 { Value };
template <auto> struct Foo;
template <> struct Foo<Enum1::Value> { };
template <> struct Foo<Enum2::Value> { };

Clangはこれをコンパイルしますが、gcc-7.2は失敗します:

x.cpp:5:20:エラー: 'struct Foo <(Enum1)0>'テンプレート<> struct Foo {}の再定義;

5行目と同様に、このエラーメッセージは無効のようEnum2::Valueです。

どのコンパイラが正しいですか?これは準拠コードですか?

ヴィットリオロメオ

[dcl.type.auto.deduct]

Tプレースホルダータイプを含むタイプ、および対応する初期化子はe、次のように決定されます。

  • 非型テンプレートパラメータがプレースホルダタイプを含むタイプで宣言するために、T非型テンプレートパラメータの宣言された型であり、e対応するテンプレート引数です。

これは、推定されたタイプがdecltype(Enum1::Value)であり、値がであると示唆しているようEnum1::Valueです。


あるdecltype(Enum1::Value)に等しいですかdecltype(Enum2::Value)このコード...

static_assert(std::is_same_v<decltype(Enum1::Value), decltype(Enum2::Value)>);

... clang ++ 6g ++ 8の両方でコンパイルに失敗します


私は考えてあなたがいることかもしれませんgccのバグを公開しています。ヨハネス・シャウブはコメントで指摘し、またありますGCCの行動を支持して段落が

開いているバグレポートがあります:#79092


また、次のコードは両方のコンパイラで受け入れられることに注意してください。

template <typename T, T> struct Foo;
template <> struct Foo<decltype(Enum1::Value), Enum1::Value> { };
template <> struct Foo<decltype(Enum2::Value), Enum2::Value> { };

template <auto> それとは異なる振る舞いをすることは、(IMHO)驚きであり、望ましくないことです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

異なるメンバーへのポインターの引数を持つ非型テンプレートパラメーターに対する特殊化は、一意の特殊化であることが保証されていますか?

分類Dev

なぜその部分的なテンプレートの特殊化が許可されているのですか?

分類Dev

関数テンプレートの特殊化は本当に許可されていますか?

分類Dev

非型引数の部分的なテンプレートの特殊化は許可されていません

分類Dev

列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

分類Dev

C ++のクラステンプレートに、特殊化されていない共通の静的メンバーを含めることは可能ですか?

分類Dev

完全に特殊化されたテンプレート関数は通常の関数と同じですか?

分類Dev

可変個引数の同名のテンプレートを特殊化することは可能ですか?

分類Dev

テンプレートの特殊化を別のタイプと同じにすることは可能ですか?

分類Dev

Constexprは、フレンドテンプレートの特殊化の宣言では許可されていませんか?

分類Dev

コンテナと列挙型のテンプレートを特殊化する方法

分類Dev

テンプレート化された関数を特殊化して、引数の型がポインターである場合とそうでない場合を区別する方法はありますか?

分類Dev

C ++ 14で自動戻り値の型を使用して明示的なテンプレートの特殊化を行うことは有効ですか?

分類Dev

同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

分類Dev

整数型自体で整数型のクラステンプレートを特殊化する方法は?

分類Dev

パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

分類Dev

クラステンプレートの部分的特殊化で例外控除は許可されていませんか?

分類Dev

C ++で、(整数型の)非型テンプレートパラメーターの型のみが異なる、同じ名前の2つの関数/クラステンプレートが許可されないのはなぜですか?

分類Dev

クラステンプレートの列挙(タイプ)メンバーを特殊化できますか?

分類Dev

Clangは、クラステンプレートのネストされたクラスが特殊化によってのみ定義されているコードを拒否することは正しいですか?

分類Dev

カスタム型のstd :: to_stringの特殊化はC ++標準で許可されていますか?

分類Dev

カスタム型のstd :: to_stringの特殊化はC ++標準で許可されていますか?

分類Dev

カスタム型のstd :: to_stringの特殊化はC ++標準で許可されていますか?

分類Dev

パラメータ化と「関数テンプレートの部分的な特殊化は許可されていません」

分類Dev

クラステンプレートの定義されていないメンバークラスの明示的な特殊化で隠された友達を定義することは合法ですか?

分類Dev

プライマリテンプレートをあいまいにすることなく、is_base_ofを使用してテンプレートを特殊化するにはどうすればよいですか?

分類Dev

ラムダ式でおなじみのテンプレート構文を使用することは許可されていますか(または使用される予定ですか)?

分類Dev

テンプレート化されたデータ型のテンプレートを特殊化する

Related 関連記事

  1. 1

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  2. 2

    異なるメンバーへのポインターの引数を持つ非型テンプレートパラメーターに対する特殊化は、一意の特殊化であることが保証されていますか?

  3. 3

    なぜその部分的なテンプレートの特殊化が許可されているのですか?

  4. 4

    関数テンプレートの特殊化は本当に許可されていますか?

  5. 5

    非型引数の部分的なテンプレートの特殊化は許可されていません

  6. 6

    列挙値のクラステンプレートを部分的に特殊化するにはどうすればよいですか?

  7. 7

    C ++のクラステンプレートに、特殊化されていない共通の静的メンバーを含めることは可能ですか?

  8. 8

    完全に特殊化されたテンプレート関数は通常の関数と同じですか?

  9. 9

    可変個引数の同名のテンプレートを特殊化することは可能ですか?

  10. 10

    テンプレートの特殊化を別のタイプと同じにすることは可能ですか?

  11. 11

    Constexprは、フレンドテンプレートの特殊化の宣言では許可されていませんか?

  12. 12

    コンテナと列挙型のテンプレートを特殊化する方法

  13. 13

    テンプレート化された関数を特殊化して、引数の型がポインターである場合とそうでない場合を区別する方法はありますか?

  14. 14

    C ++ 14で自動戻り値の型を使用して明示的なテンプレートの特殊化を行うことは有効ですか?

  15. 15

    同じテンプレート関数で複数のタイプを特殊化するにはどうすればよいですか?

  16. 16

    整数型自体で整数型のクラステンプレートを特殊化する方法は?

  17. 17

    パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

  18. 18

    クラステンプレートの部分的特殊化で例外控除は許可されていませんか?

  19. 19

    C ++で、(整数型の)非型テンプレートパラメーターの型のみが異なる、同じ名前の2つの関数/クラステンプレートが許可されないのはなぜですか?

  20. 20

    クラステンプレートの列挙(タイプ)メンバーを特殊化できますか?

  21. 21

    Clangは、クラステンプレートのネストされたクラスが特殊化によってのみ定義されているコードを拒否することは正しいですか?

  22. 22

    カスタム型のstd :: to_stringの特殊化はC ++標準で許可されていますか?

  23. 23

    カスタム型のstd :: to_stringの特殊化はC ++標準で許可されていますか?

  24. 24

    カスタム型のstd :: to_stringの特殊化はC ++標準で許可されていますか?

  25. 25

    パラメータ化と「関数テンプレートの部分的な特殊化は許可されていません」

  26. 26

    クラステンプレートの定義されていないメンバークラスの明示的な特殊化で隠された友達を定義することは合法ですか?

  27. 27

    プライマリテンプレートをあいまいにすることなく、is_base_ofを使用してテンプレートを特殊化するにはどうすればよいですか?

  28. 28

    ラムダ式でおなじみのテンプレート構文を使用することは許可されていますか(または使用される予定ですか)?

  29. 29

    テンプレート化されたデータ型のテンプレートを特殊化する

ホットタグ

アーカイブ