【问题标题】:const_cast rules in c++C++ 中的 const_cast 规则
【发布时间】:2018-11-15 02:41:38
【问题描述】:
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,行为会有所不同吗?

【问题讨论】:

  • 不管什么数据类型失去了常量,问题是编译器可以假设对象没有改变并产生相关代码。

标签: c++ constants shared-ptr const-cast


【解决方案1】:

const_cast&lt;int&amp;&gt;(f1.A) = 4 const_cast&lt;int&amp;&gt;(f2.B) = 4 的行为未定义

如果一个对象最初定义为const,而您抛弃了const-ness尝试修改该对象,则行为是未定义

【讨论】:

  • @YSC:哼。本来可以发誓f2 不是const。不过,只需要一点点编辑。谢谢。
  • 欢迎编辑使非 const 对象变为 const(即使是在星期五进行的 偷偷摸摸 编辑)。我希望有更多的人在工作。
  • 补充一下,如果一个对象本来是非常量的,然后通过一个常量指针或者常量引用,然后const_cast又回到非常量,相信是很好定义的行为。但是,在我看来,即使开发人员知道它真的是一个非常量对象,const_cast away const-ness 仍然是一种糟糕的代码气味。
  • @Eljay:是的,你是对的,无论是事实还是风格。只有当您尝试修改对象时才会得到未定义的结果。
  • @Eljay 有一种思想流派,用于重复删除 getter 的风格 class Foo { const Bar&amp; do_get() const { /* single impl */ } public: Bar&amp; get() { return const_cast&lt;Bar&amp;&gt;(do_get()); } const Bar&amp; get() const { return do_get(); } };
猜你喜欢
  • 2015-04-09
  • 1970-01-01
  • 2014-01-03
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多