详细说明的类型说明符中的类型相关嵌套名称说明符

type-dependent nested-name-specifier in elaborated-type-specifier

本文关键字:类型 说明符 嵌套 说明      更新时间:2023-10-16

在这个问题之前,我从未在详细的类型说明符中看到过嵌套的名称说明符,乍一看,我以为它甚至不在语法中。现在我看到,从C++98到现在,它被翻译为一个特例,没有类型名说明符构造。C++11 7.1.6.3/2(C++98中的7.1.5.3/2):

3.4.4描述了如何在细化的类型说明符中对标识符进行名称查找。如果标识符解析为类名枚举名,则详细类型说明符将其引入声明的方式与简单类型说明符引入其类型名

因此,尽管您可以形成一个合格的详细阐述的类型说明符,但您需要注意它从不依赖于类型。在模板定义时,根据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 S2<short>::I是允许的。