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().
这只是您正常的合格查找.来自[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,该范围根据我刚刚枚举的限定查找规则找到.
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |