正如标题中提到的,我想知道'this'
指针的类型。
我正在做一个项目,我观察到'this'
指针的类型"ClassName * const this"
在使用 VC++ 2008 的 Windows 上。好吧,我想知道使 this 指针成为常量指针的需要/要求是什么。谢谢。
正如标题中提到的,我想知道'this'
指针的类型。
我正在做一个项目,我观察到'this'
指针的类型"ClassName * const this"
在使用 VC++ 2008 的 Windows 上。好吧,我想知道使 this 指针成为常量指针的需要/要求是什么。谢谢。
此指针的类型是ClassName *
or const ClassName *
,具体取决于它是在类的非常量方法还是 const 方法中检查ClassName
。指针this
不是左值。
class ClassName {
void foo() {
// here `this` has `ClassName *` type
}
void bar() const {
// here `this` has `const ClassName *` type
}
};
您上面提到的观察结果具有误导性。指针this
不是左值,这意味着它不可能有ClassName * const
类型,即不可能在 .const
的右边有 a *
。指针类型的非左值不能是 const 或非常量。C++ 语言中根本没有这样的概念。您观察到的一定是特定编译器的内部怪癖。形式上,这是不正确的。
以下是语言规范中的相关引用(强调我的)
9.3.2 this 指针
在非静态 (9.3) 成员函数的主体中,关键字 this 是一个纯右值表达式,其值是调用该函数的对象的地址。类 X 的成员函数中 this 的类型是 X*。如果成员函数声明为 const,则 this 的类型为 const X*,如果成员函数声明为 volatile,则 this 的类型为 volatile X*,如果成员函数声明为 const volatile,则 this 的类型为 const挥发性 X*。[ 注意:因此在 const 成员函数中,调用该函数的对象是通过 const 访问路径访问的。——尾注]
早在 C++98/C++03 时代,几个编译器使用内部实现技巧是毫无价值的:他们将this
指针解释为常量指针,例如ClassName *const
在 class 的非常量方法中ClassName
。这显然有助于他们确保this
. 众所周知,GCC 和 MSVC 已经使用了该技术。这是一个无害的技巧,因为在语言级别this
上不是左值,而且它的 constness 是不可检测的。该额外const
内容通常只会在编译器发出的诊断消息中显示出来。
然而,随着 C++11 中右值引用的出现,可以const
在this
. 例如,以下代码在 C++11 中有效
struct S
{
void foo() { S *&&r = this; }
};
然而,它通常无法在仍然使用上述技巧的实现中编译。GCC 已经放弃了这项技术。MSVC++ 仍然使用它(从 VS2017 开始),这会阻止上述完全有效的代码在 MSVC++ 中编译。
const 意味着您不能更改指针指向的内容。
ClassName *const
与
const ClassName *
后者是指向对象的指针,并且无法修改对象(无论如何使用指针)。前者是一个不能重新指向另一个对象(也不是 NULL)的指针,至少在不使用讨厌的转换的情况下是这样。
当然也有组合:
const ClassName *const
这将是一个指针,不能更改为指向其他对象,也不能用于更改它指向的对象。
至于为什么您的编译器将this
指针显示为 const,确实不鼓励您this
指向一个对象而不是它开始的对象。
上面有很多讨论,主要帖子没有给出正确的答案。人们可能不会挖掘评论,所以最好作为主要端口(PS)分享。
我对 Ubuntu 和 VC++ 进行了一些调查,但没有正确的输出(使用typeid(X).name
)。
类类型 X 的成员函数的 this 指针的类型是 X* const。如果成员函数用 const 限定符声明,则类 X 的该成员函数的 this 指针的类型为 const X* const。 MSDN 链接
从概念上讲这也是正确的,因为普通的成员函数是“X* const”,这就是它不是左值的原因(因为你不能改变它的内容)。
C++ Primer 4th ed 的摘录:“在普通的nonconst
成员函数中,类型 ofthis
是类型的 a 。我们可以更改指向的值,const pointer
但不能更改保存的地址。在成员函数中,类型是 a到一个- 类型的对象。我们既不能改变指向的对象,也不能改变持有的地址。这意味着 VC++ intellisense 显示的任何内容都是正确的。class
this
this
const
this
const pointer
const class
this
this