我在尝试编译以下时收到此错误消息
void MyClass::MyFunc() const
{
int i= 0;
myList.push_back(i);
}
尽管函数返回void
,但我已经不得不将const添加到函数中,以解决函数调用本身的相同问题,但现在它发生在STL的一个成员身上,我认为我的代码出现了很大问题。作为参考,错误为
cannot convert 'this' pointer from 'const MyClass' to 'MyClass &'
事实上,我几乎不知道发生了什么,因为我从一个对编码标准和最佳实践有着虐待关系的人那里继承了这一点。如果有人能告诉我这是什么问题的症状,以及我应该在代码中寻找什么,这将对我有很大帮助。
const
意味着它不能修改被调用的实例,包括任何实例成员。
您需要查看代码库,并区分可以修改类实例(不应为const
)的方法和只提供有关类实例信息的方法(应为const
)。
如果myList
是MyClass
的数据成员,那么使用push_back()
,您正在修改myList
的数据成员(因此您正在修改由this
指向的MyClass
的实例),因此MyFunc()
方法不能标记为const
。
$9.3.1/3:当在可以使用(5.1.1)的上下文中,在类X的成员中使用不属于类成员访问语法(5.2.5)的id表达式(5.1)并且不用于形成指向成员(5.3.1)的指针时,如果名称查找(3.4)将id表达式中的名称解析为某个类C的非静态非类型成员,如果id表达式可能被求值,或者C是X或X的基类,则使用(*this)(9.3.2)作为后缀表达式将id表达式转换为类成员访问表达式(5.2.5),以的左侧。操作人员
这意味着表达式
myList.push_back(i);
被视为
(*this).myList.push_back(i);
$9.3.1/4:非静态成员函数可以声明为const、volatile或const-volatile。这些cv限定符影响这个指针的类型(9.3.2)
$9.3.2/1:在非静态(9.3)成员函数的主体中,关键字this是一个prvalue表达式,其值是为其调用函数的对象的地址。在类X的成员函数中,它的类型是X*。如果成员函数被声明为const,则this的类型为const X*,如果成员函数声明为volatile,则this类型为volatileX*,并且如果成员函数宣布为const volatile则this类型是const volabileX*。
总之,这意味着成员函数中的"this"类型(const)是"MyClass const*"。实际上,这意味着Myclass::MyFunc
不允许修改"this"指针指向的对象的状态。
假设myList的类型为std::list,方法std::list::push_back在列表中插入值"i"时修改实例变量"myList"。
但这打破了"const"成员函数MyClass::MyFunc
的语义,后者承诺不会修改对象的状态。
因此,您确实需要从该成员函数中删除"const",或者使用const_cast来删除该特定操作的constness。