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

时间:2015-05-30 22:53:15

标签: c++ alias language-lawyer c++14

请考虑以下代码段:

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

int main()
{
    std::cout << sizeof(A::Int) << '\n';
}

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

1 个答案:

答案 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的范围,该范围是根据我刚才枚举的限定查找规则找到的。