标准中哪里规定成员别名声明可以像静态成员一样使用

Where in the Standard does it say that a member alias-declaration can be used as if it was a static member?

本文关键字:静态成员 一样 声明 别名 成员 标准      更新时间:2023-10-16

考虑以下片段:

#include <iostream>
struct A { int i; using Int = int; };
int main()
{
    std::cout << sizeof(A::Int) << 'n';
}

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

这只是正常的限定查找。来自【basic.lookup.qual】:

类、命名空间成员或枚举器的名称可以在::作用域解析后引用运算符(5.1(,应用于表示其类、命名空间或枚举的嵌套名称说明符

然后从[class.qual]:

如果限定id的嵌套名称说明符指定一个类,则在的嵌套名称说明符之后指定的名称在类(10.2(的范围内查找,以下列出的情况除外。名称应代表该类别或其一个基类的一个或多个成员(第10条([注:班级成员可以在其潜在范围(3.3.7(的任何点使用限定id引用。-结束注释]例外上面的名称查找规则如下:

  • 析构函数名称[…]
  • 转换函数id[…]的转化类型id
  • 模板id[…]的template参数中的名称
  • 使用声明[…]查找中指定的名称

示例中的嵌套名称说明符A,它是一个类。这些例外都不适用。所以我们只是在类的作用域中查找名称Int

来自[dcl.typedef]:

typedef说明符声明的名称将成为typedef名称。在其声明的范围内typedef name在语法上等效于关键字,并将与中的标识符关联的类型命名为第8条所述方式。因此,typedef名称是另一种类型的同义词
[…]
typedef名称也可以通过别名声明引入。using关键字后面的标识符成为typedef名称,标识符后面的可选属性说明符seq属于typedef名称。它具有与typedef说明符引入的语义相同的语义。

因此,您的别名声明将名称Int引入到A的范围中,这是根据我刚才列举的限定查找规则找到的。