标准中的哪个部分说成员别名声明可以像使用静态成员一样使用?

Wak*_*zil 4 c++ alias language-lawyer c++14

请考虑以下代码段:

#include <iostream>
struct A { int i; using Int = int; };

int main()
{
    std::cout << sizeof(A::Int) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

它在clang和GCC中正常编译和执行.我知道这看起来很明显,但我在标准(C++ 14)中找不到任何支持引用A::Int的内容main().

Bar*_*rry 5

这只是您正常的合格查找.来自[basic.lookup.qual]:

在将::范围解析运算符(5.1)应用于表示其类,命名空间或枚举的嵌套名称说明符之后,可以引用类或命名空间成员或枚举数的名称.

然后从[class.qual]:

如果qualified-id的nested-name-specifier指定了一个类,则 在类(10.2)的范围内查找在嵌套的namespecifier之后指定的名称,但下面列出的情况除外.该名称应代表该类别或其基类之一的一个或多个成员(第10条).[注意:可以在潜在范围内的任何一点使用qualified-id引用类成员(3.3.7).-end note]以上名称查找规则的例外情况如下:

  • 析构函数名称[...]
  • 一个转换型-ID一个的转换函数-ID [...]
  • 模板ID的模板参数中的名称[...]
  • 查找using声明中指定的名称[...]

您的示例中的嵌套名称说明符A是一个类.这些例外都不适用.所以我们只Int在类的范围内查找名称.

来自[dcl.typedef]:

使用说明typedef符声明的名称将成为typedef-name.在其声明的范围内, typedef-name在语法上等同于关键字,并按照第8章中描述的方式命名与标识符关联的类型.因此,typedef-name是另一种类型的同义词.
[...]
一个typedef的名称,也可以通过引入的别名声明.using关键字后面的标识符变为typedef-name,并且该标识符后面的可选attribute-specifier-seq属于该 typedef-name.它具有与typedef说明符引入的语义相同的语义.

因此,您的别名声明会将名称Int引入范围A,该范围根据我刚刚枚举的限定查找规则找到.