【发布时间】:2016-01-26 12:37:17
【问题描述】:
我知道 const_cast 的使用不会引入未定义的行为(即,它可以安全使用),只要您的变量 const_casting 最初没有定义为 const 或者如果它最初被定义为const,您不会通过其const_casted 别名对其进行修改。
然而,众所周知,大多数 STL 容器(例如,std::vector、std::set)动态分配其内部缓冲区。基于这一事实,我认为将const 定义的std::vector 放在只读内存中是不可能的。
当然,如果上述情况成立,我会假设这种 STL 容器即使它们被定义为 const,例如:
std::vector<int> const v;
const_cast他们并通过他们的const_casted 别名更改他们是合法的,不会导致任何未定义的行为。
上述假设成立还是我错了?
【问题讨论】:
-
如果标准说是UB,那就是UB。优化器使用它来做各种疯狂的事情,假设
const对象不会被修改。 -
注意,在常量向量的情况下,编译器不需要动态分配内存(避免分配标准子句),事实上,可以放置常量向量完全在静态只读内存中。
-
@101010 我认为您选择我的答案为“解决方案”有点太快了。它还不是(在我写这篇文章的时候)你的问题的真正答案。到目前为止,我刚刚解决了动态分配的内存必须是可变的假设。
-
如果你想要一个对象是可修改的,不要说它不是。
标签: c++ c++11 stl undefined-behavior const-cast