Возвращение ссылки на член const stuct (типа указателя): видимое преобразование lvalue в rvalue

Учитывая следующий код, GCC выдает некоторые неожиданные ошибки & предупреждения. Я пытаюсь вернуть элемент структуры по ссылке, и он говорит, что я возвращаю временный! Кроме того, при попытке исправить эту функцию, он жалуется на ошибку преобразования категории значения? В любом случае, насколько я знаю, доступ члена к объекту lvalue должен производить lvalue, поэтому этот код должен работать в первую очередь. Что случилось?

Код: (жить на Колиру)

const struct {
int* iptr = nullptr;
} cnst_struct;

const int* const& return_temporary_warning() {
return cnst_struct.iptr;
}

const int*& value_cat_convert_error() {
return cnst_struct.iptr;
}

Производит (GCC):

main.cpp: In function 'const int* const& return_temporary_warning()':
main.cpp:8:24: warning: returning reference to temporary [-Wreturn-local-addr]
return cnst_struct.iptr;
^~~~
main.cpp: In function 'const int*& value_cat_convert_error()':
main.cpp:16:24: error: cannot bind non-const lvalue reference of type 'const int*&' to an rvalue of type 'const int*'
return cnst_struct.iptr;

~~~~~~~~~~~~^~~~

1

Решение

Рассматриваемый код может быть сделан для компиляции без ошибок или предупреждений, делая член структуры указателем на const:

const struct {
const int* iptr = nullptr;
} cnst_struct;

Или, заставляя функции возвращать неконстантные ссылки.

Проблема здесь (хотя и тонкая) заключается в том, что iptr member не является точно таким же типом, как потерянный тип возвращаемой ссылки, и поэтому предпринимаются попытки преобразования. Есть один, а именно int* -> const int* но результатом этого преобразования является значение, а значит и все предупреждения и ошибки.

Кроме того, Clang выдает другое предупреждение, которое, возможно, более полезно:

main.cpp:8:12: warning: returning reference to local temporary object [-Wreturn-stack-address]
return cnst_struct.iptr;
^~~~~~~~~~~~~~~~
main.cpp:16:12: error: non-const lvalue reference to type 'const int *' cannot bind to a value of unrelated type 'int *const'
return cnst_struct.iptr;
^~~~~~~~~~~~~~~~
3

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

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

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