请考虑以下代码段:
#include <iostream>
struct A { int i; using Int = int; };
int main()
{
std::cout << sizeof(A::Int) << '\n';
}
它在clang和GCC中正常编译和执行。我知道这看起来很明显,但我在标准(C ++ 14)中找不到支持A::Int
中对main()
的引用的任何内容。
答案 0 :(得分:5)
这只是您正常的合格查询。来自[basic.lookup.qual]:
可以在
::
范围解析后引用类或命名空间成员或枚举数的名称 operator(5.1)应用于表示其类,名称空间或枚举的嵌套名称说明符。
然后从[class.qual]:
如果 qualified-id 的嵌套名称说明符指定了一个类,则在 nested-namespecifier 之后指定的名称 除了下面列出的情况外,在类(10.2)的范围内查找。名字应该 表示该类或其基类之一的一个或多个成员(第10条)。 [注意:一个班级成员 可以在其潜在范围(3.3.7)的任何位置使用 qualified-id 来引用。 -end note] 例外 上面的名称查找规则如下:
- 析构函数名称[...]
- conversion-function-id的 conversion-type-id [...]
- template-id 的 template-argument 中的名称[...]
- 查找 using-declaration [...]
中指定的名称
示例中的嵌套名称说明符是A
,它是一个类。这些例外都不适用。所以我们只需在类的范围内查找名称Int
。
来自[dcl.typedef]:
使用
typedef
说明符声明的名称变为 typedef-name 。在其声明范围内,a typedef-name 在语法上等同于关键字,并命名与标识符关联的类型 第8章中描述的方式。 typedef-name 因此是另一种类型的同义词。
[...]
alde-name 也可以引入 typedef-name 。 using关键字后面的标识符 成为 typedef-name 和可选的 attribute-specifier-seq 后面的标识符属于那个 的typedef名。它具有与typedef
说明符引入的语义相同的语义。
因此,您的 alias-declaration 将名称Int
引入A
的范围,该范围是根据我刚才枚举的限定查找规则找到的。