2017-04-10 105 views
0

你可以看看這個例子代碼:返回引用一個const指針爲const類型

class Test { 
    int *a; 
    int b; 
public: 
    Test() : b(2) 
    { 
    a = new int(5); 
    } 

    const int * const& GetA() const 
    { 
    const int * const& c = a; 
    return a; 
    } 

    const int& GetB() 
    { 
    return b; 
    } 

    ~Test() 
    { 
    delete a; 
    } 
}; 

我得到回報的警告。爲什麼將一個const引用的引用返回給一個const變量是錯誤的,但是可以返回一個const變量的引用嗎?順便說一句,如果我在GetA()中返回c,它編譯得很好。

+3

你會得到什麼警告? – NathanOliver

+0

無法在VS 2015上重現問題 – alexeykuzmin0

+0

我得到了對臨時[-Wreturn-local-addr]的返回引用。 – lepo

回答

1

首先考慮const int& GetB()。這是返回對類成員b的引用的一種簡潔的方式,即不能在呼叫站點修改。由於您沒有更改任何類成員數據,因此可以將該函數標記爲const。這是慣用的C++,特別是對於大於int的類型,例如std::string

當您編寫return a;時,您允許函數調用站點通過該指針修改該類成員。雖然C++標準允許這樣做,但是它可以避免封裝,而且友好的編譯器會警告你。請注意,由於該函數本身不是而是更改了類成員,所以編譯通過,儘管它被標記爲const

寫在const int * const& c = a;編譯器假定你知道你在做什麼。

(最後要注意,所有的浩劫是放開,如果你試圖複製的Test實例由於編譯器生成的拷貝構造函數淺複製a。你應該delete拷貝構造函數和賦值運算符。)

+0

然而,當我寫例如'std :: cout << *(t-> GetA());'我得到一個段錯誤。但是當我返回c代碼工作正常。 – lepo