返回对临时,const差异的引用

时间:2013-04-18 22:51:15

标签: c++ reference const temporary

当以下代码由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);
}

1 个答案:

答案 0 :(得分:3)

由于geom.data的类型为int*,因此您无法引用int const*来引用它。要引用int const*,首先需要int const*。因此必须进行转换,因此必须创建新类型的新指针,因此它必须是临时的。

您是否需要函数的调用者才能更改geom对象中的指针指向的内容?它似乎不是,因为你正在使指针本身为const。所以只需删除引用,就可以保留const。