2010-07-10 35 views
2

當我編譯此代碼:C++:自動const?

class DecoratedString 
{ 
private: 
    std::string m_String; 
public: 
    // ... constructs, destructors, etc 
    std::string& ToString() const 
    { 
     return m_String; 
    } 
} 

我從G ++得到以下錯誤:invalid initialization of reference of type 'std::string&" from expression of type 'const std::string'

爲什麼m_String被視爲const?編譯器不應該簡單地在這裏創建一個引用嗎?

編輯:

此外,我應該怎麼做來得到這個功能作爲轉換爲一個字符串,在大多數情況下工作嗎?我做了const函數,因爲它不修改內部字符串...也許我只是需要使它返回一個副本...

編輯:好的...使它返回一個副本工作。

+2

當然,你可以讓函數返回一個'const std :: string&'。 – 2010-07-10 17:36:13

+0

@詹姆斯麥克奈利斯 - 常量將意味着......參考是不變的,或者參考文獻中的數據是不變的?對不起,剛剛閱讀了Herb Sutter關於const正確性的論文,並且試圖學習如何在代碼中更有效地使用const。 – 2010-07-10 17:38:49

+2

@sheepsimulator:這會使它成爲一個const對象的引用,就像'const std :: string *'是一個指向const對象的指針。由於引用不能被反彈(例如,一旦你初始化一個引用來引用某個對象,它就不會引用任何其他對象),「常量引用」(即std :: string&const)的概念,是無意義的。 – 2010-07-10 17:40:32

回答

9

m_String被視爲常量,因爲它是作爲

this->m_String 

this訪問是常量,因爲成員函數,ToString()是常量限定。

1

因爲該方法是const(conststd::string& ToString() const)。 Const方法參見this作爲const對象,它的成員也作爲const對象。

1

因爲您通過常數this訪問m_String(方法爲const)。

3

m_Stringconst在這一點上,因爲你已經選擇申報方法const(當然這使得所有的數據實例成員常量,太) - 如果你需要繞過該特定數據成員,你可以選擇明確地使它mutable