解释“因为不考虑限定词而传递const XXX”?

时间:2019-03-17 17:33:01

标签: c++

我上课

class Test {
public:
    void f() {}
    void g() const { f(); }
};

无法编译

  

错误:将'const Test'作为'this'参数传递会丢弃限定符(在调用void Test :: f()时使用)

我意识到我不应该从const f中调用非const g。但是,我不理解该消息的内容。 const Test对象来自哪里,哪些限定词被丢弃(f()没有任何限定词)?

2 个答案:

答案 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(); }