当方法不修改成员时,是否可以在const实例上调用非const方法?

时间:2019-10-01 15:13:51

标签: c++ const language-lawyer const-cast

代码说出一千多个单词,所以...

这是用于突变const int的未定义行为:

struct foo {
    int x;
    void modify() { x = 3; }
};

void test_foo(const foo& f) {
    const_cast<foo&>(f).modify();
}

int main(){
    const foo f{2};
    test_foo(f);
}

那呢:

struct bar {
    void no_modify() { }
};

void test_bar(const bar& b) {
    const_cast<bar&>(b).no_modify();
}

int main(){
    const bar b;
    test_bar(b);
}

在方法不改变对象的情况下是否可以通过const对象调用非const方法?(通过const_cast)?

PS :我知道应该将no_modify声明为const,然后这个问题毫无意义,但假设bar的定义不能改变。 / p>

PPS :只需确保:不要在家(或其他任何地方)这样做。我绝不会让这样的代码通过审查。可以轻松避免强制转换。这是一个语言律师问题。

2 个答案:

答案 0 :(得分:4)

代码的行为是明确定义的。

唯一重要的是实际上是否修改了对象。你不知道您要做的只是调用成员函数,而该函数不会修改对象。

答案 1 :(得分:1)

在我可以访问的C ++ 14标准N4296中,我们在5.2.11 / 6中看到一条注释:

  

[注意:根据对象的类型,通过   由a产生的数据成员的指针,左值或指针   抛弃const-qualifier74的const_cast可能会产生未定义的   行为(7.1.6.1)。 —尾注]

从技术上讲,我怀疑该注释可能不是规范性的,但似乎很清楚,此处的意图是,仅当尝试通过指针/引用进行写操作时,放弃常数性才成为未定义的行为(可能是为了帮助支持不能遵循正确的const正确性。