代码说出一千多个单词,所以...
这是用于突变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 :只需确保:不要在家(或其他任何地方)这样做。我绝不会让这样的代码通过审查。可以轻松避免强制转换。这是一个语言律师问题。
答案 0 :(得分:4)
代码的行为是明确定义的。
唯一重要的是实际上是否修改了对象。你不知道您要做的只是调用成员函数,而该函数不会修改对象。
答案 1 :(得分:1)
在我可以访问的C ++ 14标准N4296中,我们在5.2.11 / 6中看到一条注释:
[注意:根据对象的类型,通过 由a产生的数据成员的指针,左值或指针 抛弃const-qualifier74的const_cast可能会产生未定义的 行为(7.1.6.1)。 —尾注]
从技术上讲,我怀疑该注释可能不是规范性的,但似乎很清楚,此处的意图是,仅当尝试通过指针/引用进行写操作时,放弃常数性才成为未定义的行为(可能是为了帮助支持不能遵循正确的const正确性。