2011-12-12 78 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;)。

相關問題