2013-04-18 55 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。所以只需删除参考,并且可以保留常量。