c ++中的const_cast规则

use*_*155 8 c++ const shared-ptr const-cast

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
}
Run Code Online (Sandbox Code Playgroud)

第1行和第2行都表现出未定义的行为吗?请问行为有所不同,如果f1f2shared_ptr在上面的代码中列出的类型?

Bat*_*eba 15

行为都const_cast<int&>(f1.A) = 4 const_cast<int&>(f2.B) = 4不确定的.

如果最初将对象定义为const,并且抛弃了const-ness 尝试修改该对象,则行为未定义.

  • 作为附录,如果一个对象最初是非const的,然后通过const指针或const引用,然后`const_cast`回到非const,我相信这是明确定义的行为.但是,在我看来,即使开发人员知道它真的是一个非const对象,它仍然是一个糟糕的代码味道`const_cast` away const-ness. (6认同)
  • @Eljay有一个思想学派去重复复制getter的样式`class Foo {const Bar&do_get()const {/*single impl*/} public:Bar&get(){return const_cast <Bar&>(do_get()) ; } const Bar&get()const {return do_get(); } (2认同)