1

尝试编译以下内容时收到此错误消息

void MyClass::MyFunc() const
{
      int i= 0;
      myList.push_back(i);
}

我已经不得不将 const 添加到函数中,尽管它返回void,以解决调用函数本身的相同问题,但现在它发生在 STL 的成员中,我认为有些事情是非常错误的用我的代码。作为参考,错误是

cannot convert 'this' pointer from 'const MyClass' to 'MyClass &'

我实际上对发生了什么知之甚少,因为我从一个对编码标准和最佳实践有非常虐待关系的人那里继承了这一点。如果有人能告诉我这是什么问题的症状以及我应该在代码中寻找什么,那将对我有很大帮助。

4

3 回答 3

2

如果myList是 的数据成员MyClasspush_back()则您正在修改数据成员(因此您正在修改由指向myList的实例),因此方法不能标记为.MyClassthisMyFunc()const

于 2012-11-23T11:45:38.753 回答
2

conston 一个方法意味着它不能修改它被调用的实例,包括任何实例成员。

您需要查看代码库并区分可以修改类实例的方法(不应该是const)和那些只提供有关类实例的信息的方法(应该是const)。

于 2012-11-23T11:46:47.763 回答
0

$9.3.1/3:当在类成员中使用不属于类成员访问语法 (5.2.5) 且不用于形成指向成员 (5.3.1) 的指针的 id 表达式 (5.1) 时X 在可以使用 this 的上下文中 (5.1.1),如果名称查找 (3.4) 将 id-expression 中的名称解析为某个类 C 的非静态非类型成员,并且如果 id-expression被潜在评估或 C 是​​ X 或 X 的基类,则 id-expression 使用 (*this) (9.3.2) 作为左侧的后缀表达式转换为类成员访问表达式 (5.2.5)这 。操作员。

这意味着表达式

myList.push_back(i);

被视为

(*this).myList.push_back(i);

$9.3.1/4:非静态成员函数可以声明为 const、volatile 或 const volatile。这些 cv 限定符影响 this 指针 (9.3.2) 的类型。

$9.3.2/1:在非静态 (9.3) 成员函数的主体中,关键字 this 是一个纯右值表达式,其值是调用该函数的对象的地址。类 X 的成员函数中 this 的类型是 X*。如果成员函数声明为 const,则 this 的类型为 const X*,如果成员函数声明为 volatile,则 this 的类型为 volatile X*,如果成员函数声明为 const volatile,则 this 的类型为 const挥发性 X*。

总之,这意味着您的成员函数中的“this”类型是“const”是“MyClass const *”。实际上,这意味着Myclass::MyFunc不允许修改“this”指针指向的对象的状态。

假设 myList 是 std::list 类型,std::list::push_back 方法在将 'i' 的值插入列表时修改实例变量 'myList'。

但这破坏了“const”成员函数的语义,该函数MyClass::MyFunc承诺它不会修改对象的状态。

因此,您确实需要从此成员函数中删除“const”或使用 const_cast 删除此特定操作的 constness。

于 2012-11-23T12:25:33.213 回答