在标准(C ++ 14)中它表示以下两个声明是等效的吗?

时间:2015-04-17 17:28:31

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

struct A{};
int A;
struct A a;
struct A::A b;

上面的最后两个声明是等价的。它们都声明了A类型的对象。我可以在标准中找到或推断出这个吗?

1 个答案:

答案 0 :(得分:9)

[类] / 2:

  

类名插入声明它的作用域中   看到类名后立即。 类名也是   插入到类本身的范围内;这被称为   注入类名

即。 A::A::A::A也指A。在某些情况下,A::A可以命名构造函数,但是[class.qual] / 2涵盖了这一点,它的注释甚至可以解释你的例子:

  

在查找中,函数名称不被忽略 33 和    nested-name-specifier 指定一个类C

     
      
  • 如果在C中查找 nested-name-specifier 之后指定的名称是 inject-class-name          C(第9条)或
  •   
  • using-declaration (7.3.3)中是 member-declaration ,如果在嵌套名称后指定的名称 -        说明符与最后一个组件中的标识符或 simple-template-id template-name 相同             嵌套名称说明符
  •   
     

该名称被视为命名类C 的构造函数。 [注意: 例如,构造函数不可接受   查找结果在 elaborated-type-specifier 中,所以构造函数   不会用来代替注入类名 - 结束   注意]   

<小时/>    33)忽略函数名称的查找包括   出现在嵌套名称说明符中的名称,详细说明类型 -   说明符基本说明符

所以在诸如

之类的陈述中
A::A a;

查找A::A时,函数名称被忽略,因此代码格式错误,因为A::A指的是构造函数。但是,在

struct B : A::A {};
struct A::A a;

一切都很好,因为在base-specifiers和elaborated-type-specifiers中忽略了函数名。