2016-06-11 61 views
2

C++標準是否允許在模板聲明中設置屬性?例如:可以將屬性應用於模板嗎?

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

我相信attr4會被認爲是模板實例(即,那將是T<int>T<char>的屬性,例如)有效的屬性。

然而,attr1attr3被編譯器認爲是有效的(即使它會被忽略)?

attr2也會有效嗎?我想不是,但我不確定。問題是如果它將一個屬性「添加」到用於實例化的給定類型中,但是IIRC當前的模板參數忽略了所有屬性。

我對attr1和/或attr3的興趣是用於自定義測試DSL,其中模板上的給定屬性會自動強制使用給定的一組類型實例化類。

回答

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

相關問題