2013-04-18 54 views
1

當下列代碼由g ++或clang ++編譯時,我得到警告「返回對臨時對象的引用」(g ++)和「返回對本地臨時對象的引用」(clang ++)。返回引用臨時,常量差異

有人能告訴我爲什麼getData_warning展示這些警告,而getData_nowarning不?

struct Geom { 
    int * data; 
}; 


// Not ideal because one can change the pointed to value 
int * const & getData_nowarning (Geom const & geom) { 
    return geom.data; 
} 


// Ideal because one cannot change the pointed to value. 
int const * const & getData_warning (Geom const & geom) { 
    return geom.data; // <------------------- WARNING HERE 
} 


void test() { 
    Geom const geom = { new int(0) }; 

    int * data1 = getData_nowarning(geom); 

    int const * data2 = getData_warning(geom); 
} 

回答

3

由於geom.data類型是int*,你不能引用它來int const*參考。爲了參考int const*,首先你需要一個int const*。所以必須進行轉換,因此必須創建一個新類型的新指針,因此它必須是臨時的。

您是否需要該函數的調用者才能夠更改geom對象中的指針指向的內容?它看起來不是,因爲你正在使指針本身爲const。所以只需刪除參考,並且可以保留常量。