簡體   English   中英

在elaborated-type-specifier中依賴於類型的嵌套名稱說明符

[英]type-dependent nested-name-specifier in elaborated-type-specifier

這個問題之前,我從未在詳細說明類型說明符中看到過嵌套名稱說明符,乍一看我認為它甚至沒有被語法覆蓋。 現在我看到,從C ++ 98到現在,它被翻譯為沒有typename-specifier結構的特殊情況。 C ++ 11 7.1.6.3/2(C ++ 98中的7.1.5.3/2):

3.4.4描述了如何在詳細類型說明 中對標識符進行名稱查找。 如果標識符解析為類名枚舉名 ,則elaborated-type-specifier將它引入聲明,就像simple-type-specifier引入其類型名一樣

因此,雖然您可以形成一個合格的詳細類型說明符,但您需要注意它從不依賴於類型。 在模板定義時,每3.4.4的名稱解析將永遠不會找到類名,因為除非前綴為typename關鍵字,否則依賴名稱將被假定為對象,在此上下文中不允許使用語法。

這是對標准含義和語言設計意圖的准確評估嗎?

從評論中擴展:

以此程序為例:

template <typename T>
struct S1 { struct I { }; };

template <typename T>
struct S2 { typedef struct S1<T>::I I; }; // okay

template <typename T>
struct S3 { typedef struct S2<T>::I I; }; // okay at definition time
                                          // usually error at instantiation time
template <>
struct S2<short> : S1<short> { };

int main() {
  S1<int>::I a;
  S2<int>::I &b = a; // okay
  S3<int>::I &c = b; // error
  S1<short>::I d;
  S2<short>::I &e = d; // okay
  S3<short>::I &f = e; // okay
}

在模板定義時, S2S3都可以:14.6p5列出了不需要typename的異常。 基本上:在使用明確的地方,因為名稱永遠不能是類型以外的任何名稱,因此不需要typename 這包括幾種在語法上不允許使用typename情況,因此需要typename意味着無法編寫程序。 typename struct S<T>::Istruct typename S<T>::I都是硬錯誤, struct S<T>::I是明確的。

在模板實例化時,3.4.4的規則更清楚: struct S1<int>::Istruct S2<int>::I然后可以找到,其中很明顯S2<int>::I是一個typedef,所以struct S2<int>::I是一個錯誤。 同時,在那時, S2<short>::I被認為不是typedef,而是一個struct,所以struct S2<short>::I是允許的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM