2013-04-25 72 views
4

在C++ 11标准其描述type-nameclass-name具有以下语法:非简单模板标识的非类名C++ 11类型名称?

type-name: 
    class-name 
    enum-name 
    typedef-name 
    simple-template-id  <--- HERE 

class-name: 
    identifier 
    simple-template-id 

我的问题是关于simple-template-id那就是type-name的嫡系。

是否有可能有一个simple-template-id这是一个type-name但不是class-name

例如,如果foo<bar>命名一个类型,它可以永远是非类类型吗?

(如果答案是否定的,是有我丢失为什么simple-template-idtype-name下重复其他原因?)

+1

当你引用标准,通常最好包括部分编号或段落名称(该部分右上方的[[something.something]),以便其他人可以找到您正在谈论的内容,以防他们需要/需要更多上下文。 – 2013-04-25 04:11:57

+1

@JerryCoffin:在标准的后面有一个“语法产品索引”,它给出了正文中提到的特定语法的页码,以及它在附件A语法总结中的位置 - 但是我认为答案不能在本地找到特定部分(或者至少不在本地提及这些语法的地方)。 – 2013-04-25 04:18:18

回答

5

这是可能的,例如:

template <typename T> using Ptr = T *; 

Ptr<int> p = 0; 
+0

这是一个“别名模板”,14.5.7 [temp.alias]。 – 2013-04-25 04:26:59

+0

这是C++ 11中的新增功能,实际上C++ 03不包括* simple-template-id *作为* type-name *的生产规则,仅用于* class-name *。 – Potatoswatter 2013-04-25 04:34:56

+0

有趣的是,'simple-template-id'没有被添加到'typedef-name'来代替。也许有适用于'typedef-names'的语义,它们不适用于别名模板。 – 2013-04-25 04:39:37