可以将属性应用于模板吗?

时间:2016-06-11 23:05:09

标签: templates c++11

C ++标准是否允许在模板声明上设置属性?例如:

[[attr1]] template <typename T [[attr2]] > [[attr3]]
class [[attr4]] C {};

我相信attr4会被视为模板实例的有效属性(例如,它会是T<int>T<char>上的属性。

然而编译器会认为attr1attr3有效(即使它会被忽略)?

attr2也有效吗?我想不是,但我不确定。问题是,如果它&#34;添加&#34;实例化中使用的给定类型的属性,但IIRC当前模板参数忽略了所有属性。

我对attr1和/或attr3的兴趣是针对自定义测试DSL,其中模板上的给定属性会自动强制使用给定的一组类型对类进行实例化。

1 个答案:

答案 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]]