发生注入类名时会发生什么情况?(C++)
What happens when Injected-Class-Name occurs? (C++)
根据 https://en.cppreference.com/w/cpp/language/injected-class-name
在类作用域中,当前类的名称被视为 是公共成员名称;这称为注入类名。这 名称的声明点紧随开幕后 类定义的大括号。
int X;
struct X {
void f() {
X* p; // OK. X refers to the injected-class-name
::X* q; // Error: name lookup finds a variable name, which hides the struct name
}
};
那么代码中到底发生了什么呢?X* p
变成了X::X* p
吗?
那么代码中到底发生了什么?X* p 会变成
X::X*
p 吗?
基本上。 名称查找规则从最窄的范围开始。 当你在f
中X* p;
时,它会在f
的范围内查找,但找不到任何东西。 然后它会检查X
的作用域,因为f
的作用域为X
。 它找到X
因为它被注入到类作用域中,所以它停在那里,你得到类类型。
当你做::X* q;
时,::X
说在全局命名空间中查找X
,并且找到一个变量,而不是一个类型,所以你得到一个错误。
此限定名称::X
在全局命名空间中搜索。由于没有具有此类名称的类型(变量声明隐藏了类型struct X
(,编译器会发出错误。
您可以使用一个精心设计的名称,例如
int X;
struct X {
void f() {
X* p; // OK. X refers to the injected-class-name
struct ::X* q; // OK. elaborated name struct ::X
}
};
相关文章:
- 将指针分配给另一个指针时会发生什么情况?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 发生注入类名时会发生什么情况?(C++)
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 重新分配向量时,向量中的内存会发生什么情况
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 使用 Google 基准测试时返回值会发生什么情况?
- 正在连接的等待条件变量的线程会发生什么情况?
- 如果未定义的C++行为符合 C 定义的行为,会发生什么情况?
- 在什么情况下,使用'const T*'输入参数比'const T&'更可取?
- 如果字符串在 C/C++ 中没有 NUL 字符(以防编译器允许它通过)会发生什么情况?
- 将虚拟方法定义为私有方法时会发生什么情况?
- 如果我将"reference to vector"分配给"vector"会发生什么情况
- 初始化原子指针是原子的吗?如果初始化或内存分配引发,会发生什么情况?
- 在 C++ 中取消引用字符串时会发生什么情况