C++中的const_cast规则

8
struct foo
{
    const int A;
    int B;
    foo() : A(10), B(20) {}
};

void main()
{
    foo f1;
    const_cast<int&>(f1.A) = 4; //line 1
    const foo f2;
    const_cast<int&>(f2.B) = 4; //line 2
}

线路1和线路2是否都表现出未定义行为?如果f1f2是上面代码中列出的shared_ptr类型,行为会有所不同吗?


2
无论丢失const属性的数据类型是什么,问题在于编译器可以假设对象不会改变,并生成相应的代码。 - Slava
1个回答

15

const_cast<int&>(f1.A) = 4const_cast<int&>(f2.B) = 4 的行为都是未定义的

如果一个对象最初被定义为const,并且你取消了该const属性,并尝试修改该对象,则行为是未定义的


@YSC:嗯,我本来以为f2是非const的。不过只需要进行一点小修改就可以了。谢谢。 - Bathsheba
1
欢迎进行将非const对象变为const的编辑(即使是在周五偷偷摸摸地进行的编辑)。我希望在工作中能有更多这样的编辑。 - YSC
6
补充一点,如果一个对象最初是非const的,然后通过const指针或const引用传递,然后再使用const_cast转换回非const,我认为这是定义良好的行为。但是,在我看来,即使开发人员知道它确实是非const对象,const_cast仍然是不好的代码实践。 - Eljay
1
@Eljay:是的,你说得对,无论是事实上还是风格上。只有当你尝试修改对象时才会得到未定义的结果。 - Bathsheba
2
@Eljay,有一种去重获取器的思想风格,如下所示:class Foo { const Bar& do_get() const { /* 单一实现 */ } public: Bar& get() { return const_cast<Bar&>(do_get()); } const Bar& get() const { return do_get(); } }; - Caleth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接