MSVC编译报错:为何this指针转换提示是const S→S&而非const S*→S*?
为何MSVC提示将
const S转换为S &而非const S*转换为S*? 代码示例
struct S { void f() {} }; int main() { const S s; s.f(); // MSVC错误提示:'void S::f(void)': cannot convert 'this' pointer from 'const S' to 'S &' }
疑问点
编译上述代码时,MSVC给出的错误提示是将this指针从const S转换为S &,但从C++成员函数的调用逻辑来看,this本身是指针类型,预期的错误提示应该是const S*转换为S*,为什么MSVC会用引用的方式表述这个错误?
解答
这本质是MSVC错误提示的措辞选择问题,核心逻辑和你预期的指针类型转换错误完全一致:
- 在C++中,调用成员函数
s.f()会被编译器转换为S::f(&s),其中&s的类型是const S*(因为s是const对象)。 - 非const成员函数
S::f()的this指针类型是S*,这意味着函数期望操作一个可修改的S对象。 - 这里的矛盾是:不能将指向const对象的指针(
const S*)隐式转换为指向非const对象的指针(S*),这属于权限放大的非法转换。
MSVC只是换了一种等价的表述方式:它将this指针指向的对象类型作为描述重点——函数期望的是一个S&(可修改的S对象的引用,等价于S*指针指向的可修改对象),但实际传递的是const S类型的对象,因此提示无法完成这个转换。两种表述指向的是同一个问题:非const成员函数不允许被const对象调用,因为这会破坏const对象的只读属性。
只要将S::f()声明为const成员函数(void f() const {}),this指针的类型就会变为const S*,此时转换合法,错误就会消除。
内容的提问来源于stack exchange,提问作者starriet 차주녕
相关产品推荐
相关产品推荐

