C ++标准是否允许在模板声明上设置属性?例如:
[[attr1]] template <typename T [[attr2]] > [[attr3]]
class [[attr4]] C {};
我相信attr4
会被视为模板实例的有效属性(例如,它会是T<int>
和T<char>
上的属性。
然而编译器会认为attr1
或attr3
有效(即使它会被忽略)?
attr2
也有效吗?我想不是,但我不确定。问题是,如果它&#34;添加&#34;实例化中使用的给定类型的属性,但IIRC当前模板参数忽略了所有属性。
我对attr1
和/或attr3
的兴趣是针对自定义测试DSL,其中模板上的给定属性会自动强制使用给定的一组类型对类进行实例化。
答案 0 :(得分:3)
我深入研究了C ++语法,以下是相关部分:
declaration:
block-declaration
template-declaration
template-declaration:
template < template-parameter-list > declaration
禁止[[attr1]]
和[[attr3]]
,如果您认为我,declaration
可能不会以attribute-specifier-seq
开头。
template-parameter-list:
template-parameter
template-parameter:
type-parameter
type-parameter:
type-parameter-key ..._opt identifier_opt
type-parameter-key:
class
typename
在正则表达式中禁止[[attr2]]
,identifier
为[a-zA-Z_][a-zA-Z_0-9]*
,universal-character-name
和其他实现定义的字符。
declaration:
block-declaration
simple-declaration:
decl-specifier-seq_opt init-declarator-list_opt ;
decl-specifier-seq:
decl-specifier attribute-specifier-seq_opt
decl-specifier:
type-specifier
type-specifier:
class-specifier
class-specifier:
class-head { member-specification_opt }
class-head:
class-key attribute-specifier-seq_opt class-head-name class-virt-specifier_opt base-clause_opt
允许[[attr4]]