假设我们有test.cpp
如下:
class A;
class B
{
private:
A mutable& _a;
};
汇编:
$> gcc test.cpp
test.cpp:6:20: error: reference ‘_a’ cannot be declared ‘mutable’ [-fpermissive]
我的gcc:
$> gcc --version
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
为什么?
答案 0 :(得分:37)
没有理由让参考成员变得可变。为什么?因为const成员函数可以更改类成员引用的对象:
class B {
public:
B(int var) : n(var) {};
void Set(int val) const { n = val; } //no error
void SetMember(int val) const { m = val; } //error assignment of member `B::m' in read-only structure
protected:
int& n;
int m;
};
答案 1 :(得分:11)
根据标准: [7.1.1第8段]:
"可变说明符只能应用于类数据的名称 成员(9.2)并不能应用于声明为const或static的名称, 并且不能适用于参考成员。"
所以它只是非法的。
答案 2 :(得分:10)
只能在构造对象时分配引用,此后才能修改引用。因此,使它们mutable
没有任何意义,这就是标准不允许它的原因。
答案 3 :(得分:3)
这可能会让你大吃一惊,但引用永远不可变(不能引用另一个对象)并且引用的值总是可变的(除非你有一个引用到const):
#include <iostream>
struct A
{
int& i;
A(int& n): i(n) {}
void inc() const
{
++i;
}
};
int main()
{
int n = 0;
const A a(n);
a.inc();
std::cout << n << '\n';
}
const方法意味着将顶级const限定符添加到成员中。对于引用,这不做任何事情(= int & const a;
),对于指针而言它是指针,而不是指针const(= int* const p
,而不是const int* p;
)。