struct A{};
int A;
struct A a;
struct A::A b;
上面的最后两个声明是等价的。它们都声明了A类型的对象。我可以在标准中找到或推断出这个吗?
答案 0 :(得分:9)
[类] / 2:
将类名插入声明它的作用域中 看到类名后立即。 类名也是 插入到类本身的范围内;这被称为 注入类名。
即。 A::A::A::A
也指A
。在某些情况下,A::A
可以命名构造函数,但是[class.qual] / 2涵盖了这一点,它的注释甚至可以解释你的例子:
在查找中,函数名称不被忽略 33 和 nested-name-specifier 指定一个类
C
- 如果在
C
中查找 nested-name-specifier 之后指定的名称是 inject-class-nameC
(第9条)或- 在 using-declaration (7.3.3)中是 member-declaration ,如果在嵌套名称后指定的名称 - 说明符与最后一个组件中的标识符或 simple-template-id 的 template-name 相同 嵌套名称说明符,
该名称被视为命名类
<小时/> 33)忽略函数名称的查找包括 出现在嵌套名称说明符中的名称,详细说明类型 - 说明符或基本说明符。C
的构造函数。 [注意: 例如,构造函数不可接受 查找结果在 elaborated-type-specifier 中,所以构造函数 不会用来代替注入类名。 - 结束 注意]
所以在诸如
之类的陈述中A::A a;
查找A::A
时,函数名称不被忽略,因此代码格式错误,因为A::A
指的是构造函数。但是,在
struct B : A::A {};
struct A::A a;
一切都很好,因为在base-specifiers和elaborated-type-specifiers中忽略了函数名。