繁体   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