我上课
class Test {
public:
void f() {}
void g() const { f(); }
};
无法编译
错误:将'const Test'作为'this'参数传递会丢弃限定符(在调用void Test :: f()时使用)
我意识到我不应该从const f
中调用非const g
。但是,我不理解该消息的内容。 const Test
对象来自哪里,哪些限定词被丢弃(f()
没有任何限定词)?
答案 0 :(得分:4)
this
成员函数中的const
指针的类型为const Test*
。这就是在逻辑上强制执行仅const
成员访问的方式。这是一种实现细节,但相当合理。
当您尝试调用f()
时,请将其视为传递的隐藏函数参数。隐藏的函数参数是this
指针。 f()
期望有一个Test*
,但是您要传递一个const Test*
。两者之间的转换将“舍弃限定词”,即必须丢弃const
,这是不允许的。
诊断是有点深奥的,我同意,但是它基本上总是意味着“您正在尝试在const
上下文中执行非const
的事情”。
答案 1 :(得分:2)
不可能{sup> 1 从f()
调用g()
,因为g()
是const
(这意味着隐式this
指针是const
),而f()
不是const
。
因此,在您的情况下,编译会失败,并提供有用的诊断。
1 不是相当是不可能的:如果对象是创建的,则其行为可能是未定义的 > const
是
void g() const { const_cast<Test*>(this)->f(); }