2013-04-25 78 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