$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。