Leo*_*eon 8 c++ language-lawyer c++14
struct A{};
int A;
struct A a;
struct A::A b;
Run Code Online (Sandbox Code Playgroud)
上面的最后两个声明是等价的.它们都声明了类型A的对象.在标准中我可以找到或推断出这个吗?
[类]/2:
一个类名被插入在其中的类名是看到后立即宣布的范围.的类名也被插入到类本身的范围; 这被称为 注入类名.
即A::A::A::A
是指A
为好.在某些情况下,A::A
可以改为命名构造函数,尽管 - [class.qual]/2涵盖了这一点,它的注释甚至可以解释你的例子:
在查找中,函数名称不被忽略33和嵌套名称说明符指定一个类
C
- 如果后指定的名称嵌套名称说明符,当在抬头
C
,是注射类名 的C
(第9节),或- 如果在嵌套名称说明符之后指定的名称与最后一个组件中的标识符或simple-template-id的模板名称相同,则在作为成员声明的using声明(7.3.3)中使用对的嵌套名称说明符,
而是将名称视为命名类的构造函数
C
.[ 注意: 例如,构造函数在详细类型说明符中不是可接受的查找结果,因此不会使用构造函数来代替inject-class-name. - 结束说明 ]
33)忽略函数名称的查找包括出现在嵌套名称说明符,详细类型说明符或基本说明符中的名称.
所以在一个声明如
A::A a;
Run Code Online (Sandbox Code Playgroud)
查找时不会忽略函数名A::A
,因此代码A::A
在构造函数引用时格式不正确.但是,在
struct B : A::A {};
struct A::A a;
Run Code Online (Sandbox Code Playgroud)
一切都很好,因为在base-specifiers和elaborated-type-specifiers中忽略了函数名.