2013-04-18 3 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*. Таким образом, должно быть преобразование, поэтому должен быть создан новый указатель нового типа, и поэтому он должен быть временным.

Вам нужно, чтобы вызывающая функция имела возможность изменить то, на что указывает указатель в объекте геометрии? Казалось бы, нет, поскольку вы создаете указатель сам const. Поэтому просто снимите ссылку, и вы можете сохранить const.

Смежные вопросы