【发布时间】:2014-06-17 15:36:38
【问题描述】:
什么时候可以,什么时候不能调用可变变量?
int/float/bool 值很清楚。
但是,比方说,数组。如果我要向它添加元素,我可以调用原生数组mutable 吗?与std::vector 相同。
还有一个例子。我有对象 A,它保持对另一个对象 B 的引用 (B &b)。对象 B 有本机数组,我将重新分配/std::vector(我认为在这种特殊情况下是相似的)。伪代码:
struct B{
std::vector<int> arr;
// int *arr; //Or this
void changeArr(){
arr.push_back(90);
}
}
struct A{
A(B &b) : b(b){};
mutable B &b; // is it ok to have it "mutable"?
//mutable B b; // or even this?
void fire() const{
b.arr.push_back(125);
// Or
b.changeArr();
}
}
我可以打电话给B &b mutable 吗?
更新
根据http://en.cppreference.com/w/cpp/language/cv:
mutable - 定义一个类的成员不影响 类的外部可见状态。
这是什么externally visible state of the class?当我增加数组大小,重新分配一些东西时,我会改变它吗?如果没有,什么时候改变?
【问题讨论】:
-
mutable类似于const或volatile -
只有不是
const或static的成员变量才可能是mutable。 -
好的。但与
const不同,en.cppreference.com/w/cpp/language/cv“可变——定义类的成员不影响类的外部可见状态。”它应该“不影响类的外部可见状态”。这个“类的外部可见状态”是什么? -
mutable关键字的一个示例是类中的可变互斥锁,可以锁定在const函数中。互斥量不能为const,因为需要修改,但需要在const函数中修改,所以需要mutable限定符。