C++20言語仕様では、コンセプト定義に対して属性(attribute)を指定できない。
2024-08-13追記:本件はCWG 2428でC++20 DRとして修正され、コンセプト(concept)に対するdeprecated
属性指定が許可される。属性指定位置に注意。
// OK: CWG 2428適用後 template <typename T> concept C [[deprecated("concept")]] = /*...*/;
template <typename T> [[deprecated("concept")]] // NG: ill-formed concept C = /*...*/; // OK: 変数テンプレート template <typename T> [[deprecated("variable")]] T var = /*...*/; // OK: 関数テンプレート template <typename T> [[deprecated("function")]] void func(T) { /*...*/ } // OK: クラステンプレート template <typename T> class [[deprecated("class")]] S0 { /*...*/ }; // OK: エイリアステンプレート template <typename T> struct S1 {}; template <typename T> using A [[deprecated("alias")]] = S1<T>;
メモ:エイリアステンプレート(alias template)に対するdeprecated属性指定は、GCC/Clangともに機能しない模様… MSVCは期待通り警告C4996が報告される。
C++20 13.1/p1, 13.7.8/p1より一部引用。
1 A template defines a family of classes, functions, or variables, an alias for a family of types, or a concept.
template-declaration:
template-head declaration
template-head concept-definition
template-head:
template
<
template-parameter-list>
requires-clauseopt
template-parameter-list:
template-parameter
template-parameter-list,
template-parameter
requires-clause:
requires
constraint-logical-or-expression
(snip)
1 A concept is a template that defines constraints on its template arguments.
concept-definition:
concept
concept-name=
constraint-expression;
(snip)
関連URL