为何C++中class::A写法可通过编译?
为什么C++中
class::A是合法语法? 先看你提供的可正常编译的代码:
class A { public: A(){} }; int main() { class::A* a = new class::A(); return 0; }
这个看似多余的class::A写法,其实是C++注入类名机制的延伸用法,核心是为了消除命名歧义:
- 每个类在自身作用域里会自动注入一个和类名完全相同的“内部名字”,这个名字可以用
class(对应类)、struct(对应结构体)或者union(对应联合体)作为限定符,明确指代类类型,避免和作用域内其他同名的变量、函数混淆。 - 即使在类的外部(比如全局作用域),这种写法依然合法——当当前作用域存在和类同名的其他实体时,
class::A就能明确指定我们要引用的是类类型的A,而不是其他同名对象。比如如果全局作用域里有个int A;,直接写A会优先指代这个变量,class::A则会精准指向类A。 - 你给出的例子里没有同名冲突,所以这个写法看起来没意义,但语法上是允许的,本质是C++为覆盖所有命名歧义场景保留的规则。
内容的提问来源于stack exchange,提问作者user27044175
相关产品推荐
相关产品推荐

