Fre*_*ner 9 c++ const function member variable-assignment
我有一个类成员myMember,它是一个myType指针.我想在声明为const的函数中分配此成员.我这样做:
void func() const
{
...
const_cast<myType*>(myMember) = new myType();
...
}
Run Code Online (Sandbox Code Playgroud)
这样做在VC++中工作正常,但GCC给出了错误消息"左值作为赋值的左值".
使成员可变允许我简单地删除const_cast并分配值.但是,我并不完全确定这会带来其他副作用.
我可以指定我的会员而不必让会员变成可变的吗?怎么样?是否有任何副作用使成员变得可变?
Ste*_*ham 17
这种情况 - 封装的内部状态更改不会影响外部状态(例如缓存结果) - 正是mutable关键字的用途.
代码实际上不能在VC++中工作 - 你没有更新值(或者至少它不应该),因此来自GCC的警告.正确的代码是
const_cast<myType*&>(myMember) = new myType();
Run Code Online (Sandbox Code Playgroud)
或[来自其他回复,谢谢:P]:
const_cast<ThisType*>(this)->myMember = new myType();
Run Code Online (Sandbox Code Playgroud)
使其可变实际上意味着你得到隐含const_casts中const的成员函数,也就是通常你应该对当你发现自己做的负载下转向const_castS上this.除此之外,没有"使用可变的副作用".
正如你可以从围绕这个问题的强烈争论中看到的那样,对你的代码中使用mutable很多东西const_cast肯定会是恶臭的症状.从概念的角度来看,抛弃常量或使用mutable可能会产生更大的影响.在某些情况下,正确的做法可能是将方法更改为非const,即拥有它正在修改状态的事实.
这一切都取决于你的上下文中有多少const-correctness重要 - 你不希望最终只是mutable像pixie dust 一样缩小以使东西工作,但mutable如果成员不是对象的可观察状态的一部分,则用于使用.最严格的const-correctness视图会认为对象的状态不能被修改(例如,如果你的实例在ROM中,这可能是关键的......) - 在这种情况下你不需要任何constness迷路了.在其他情况下,您可能将某个外部状态存储在对象的某个位置 - 例如,在决定是否合适时还需要考虑特定于线程的缓存.
const_cast几乎总是设计失败的标志.在你的例子中,要么func()不应该const,也不myMember应该mutable.
一个打电话的人func()会期望她的对象不会改变; 但这意味着"不要以她能注意到的方式改变"; 这是,不要改变它的外部状态.如果更改myMember不改变对象外部状态,那就是mutable关键字的用途; 否则,func()不应该const,因为你会背叛你的功能保证.
请记住,这mutable不是一种循环正确性的机制; 它是一种改进它的机制.
class Class{
int value;
void func()const{
const_cast<Class*>(this)->value=123;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8925 次 |
| 最近记录: |