Возврат ссылки на временные, постоянные различия

Когда следующий код скомпилирован 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

Решение

Потому что тип geom.data является int*Вы не можете ссылаться на него со ссылкой на int const*, Чтобы сделать ссылку на int const*сначала тебе нужна int const*, Таким образом, должно быть преобразование, поэтому должен быть создан новый указатель нового типа, и поэтому он должен быть временным.

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]