'std :: list< _Ty> :: push_back':无法从'const std :: list< _Ty>'转换'this'指针到'std :: list< _Ty> &安培;”

时间:2012-11-23 11:43:41

标签: c++ const

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

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

我已经不得不将const添加到函数中,尽管它返回void,以修复函数本身调用的相同问题,但现在它与STL的成员一起发生,我在想我的代码是非常错误的。作为参考,错误是

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

我实际上很少知道自从我从与编码标准和最佳实践有非常滥用关系的人那里继承了这些内容后发生了什么。如果有人能告诉我这是代码的症状和我应该寻找什么问题,那对我有很大帮助。

3 个答案:

答案 0 :(得分:2)

如果myListMyClass的数据成员,push_back()您正在修改myList数据成员(因此您正在修改MyClass的实例由this)指出,因此MyFunc()方法无法标记为const

答案 1 :(得分:2)

对方法的

const意味着它无法修改调用它的实例,包括任何实例成员。

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

答案 2 :(得分:0)

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

这意味着表达式

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是一个prvalue表达式,其值是调用该函数的对象的地址。类X的成员函数中的类型是X *。如果成员函数声明为const,则其类型为const X *,如果成员函数声明为volatile,则其类型为volatile X *,如果成员函数声明为const volatile,则此类型为const易变的X *。

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

假设myList的类型为std :: list,则std :: list :: push_back方法会修改实例变量'myList',因为它会在列表中插入'i'的值。

但是这打破了'const'成员函数MyClass::MyFunc的语义,它保证不会修改对象的状态。

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