2014-07-04 19 views
6

以下代碼被gcc,vC++和clang接受。是否使用C++標準定義變量?A <int> :: template B <int> x;`?

template<class T> 
struct A 
{ 
    template<class U> 
    struct B 
    {}; 
}; 

int main() 
{ 
    A<int>::B<int> y; // OK as expected 
    A<int>::template B<int> x; // Also OK! Is this standard-compliant? 
}; 

使用A<int>::template B<int> x;是否符合C++標準定義變量?

+0

B是一個依賴於模板的類型模板,所以第二個語法是完全正確的。 – Quentin

+0

您能否將我引薦至指定此用法的標準頁面?謝謝。 – xmllmx

+3

@peppe不是重複的,因爲你不需要在這裏使用'template'。 – juanchopanza

回答

12

即使它是一個非規範性的說明,我想一個答案可以通過n3797 [temp.names/6

被賦予作爲與typename前綴的情況下,template前綴被允許在不是絕對必要的情況下;即當嵌套名稱說明符->.左邊的表達式不依賴於模板參數,或者該用法未出現在模板範圍內時。

在OP的示例中,前綴template使用模板的範圍之外,並且前述嵌套名稱說明符不依賴。因此,前綴template不是必需的,但在此處允許。


[expr.prim.general]/8

合格-ID
        嵌套名稱說明符template選擇 不合格-id

加[temp.names]/5

阿由關鍵字template前綴名應爲模板id或名稱應當指一類模板。

[temp.names]/1說B<int>確實是一個(簡單 -模板id

+0

這一切都適用於C++ 11 +,不適用於C++ 98/03。我對嗎? – Constructor

+2

@Constructor在C++ 03中,即使* nested-type-name *不依賴,你也可以使用關鍵字'template';但你不允許在模板範圍之外使用它。 – dyp

+0

是的,謝謝。 – Constructor

相關問題