标准中哪里规定成员别名声明可以像静态成员一样使用
Where in the Standard does it say that a member alias-declaration can be used as if it was a static member?
考虑以下片段:
#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
的范围中,这是根据我刚才列举的限定查找规则找到的。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 模板化类中静态成员的延迟初始化
- 使用静态成员声明类时遇到问题
- C++:是否可以使用非静态成员变量模板?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在复杂继承中访问静态成员变量
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- C++构造函数和静态成员
- 为什么传递非静态成员函数会导致编译错误?
- 非静态成员失败的线程调用函数
- 静态成员变量不会由 gettext 转换
- decltype:使用指针访问类的静态成员
- 是否可以像重载另一种类型的成员访问运算符一样解析静态成员
- 标准中哪里规定成员别名声明可以像静态成员一样使用