2011-12-12 59 views
23

比方说,我们有一个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

你在找指针吗? –

+0

即使你可以这样做,它也是无用的,因为C++不包含任何可以改变引用的语法。你甚至不能得到参考的内存地址。如果您尝试获取参考指向的对象的地址。 – bames53

+0

对不起,我问了一个错误的问题。这不是一个可变引用,这是对可变对象的引用! (我改了标题) – Martin

回答

34

没有理由让引用成员可变。为什么?因为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; 
}; 
+0

谢谢!这是我正在寻找的答案。 – Martin

10

引用只能在构建对象时分配,并且以后不能修改。因此使他们mutable将没有意义,这就是为什么标准不允许它。

+2

但是引用可以是const或非const。所以'可变的A&A'应该没问题,不是吗? (现在不在编译器附近。) –

+2

但是在这种情况下,'mutable'适用于被引用的对象,而不是引用。 –

9

根据标准: [7.1.1第8]:

“的可变说明符可以仅应用于类数据的名称 部件(9.2),并且不能应用于名称声明为常量或静态, 并且不能应用于参考成员。“

所以这只是非法的。

2

这可能会打击你的心了,但一提的是永不可变(不能进行参考另一个对象)和引用的值始终是可变的(除非你有一个参考给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;)。

相关问题