ideas
ideas copied to clipboard
Запретить возврат ссылок на временные объекты
На данный момент возвращать ссылку на временный объект является UB. Можно считать ill-formed код, если функция возвращает ссылку (без учета cv-квалифаеров) и в return statement указан возврат локальной/рвалуе переменной.
int& GetRef()
{
int x = 42;
return x; // Хорошо бы тут Compilation Error returning reference to local variable
}
Позволит увидеть подобные ошибки на этапе компиляции, вместо UB на рантайме. Следует отметить, что в компиляторе MSVC подобный код еще и работает нормально, что создает ложное впечатление о "правильности" кода и его переносимости (GCC будет писать ворнинг -Wreturn-local-addr на такой возврат). Также, механизм определения подобного кода существует (ворнинг в GCC), но не у всех включен + не все включают Treat Warning as Errors. А ворнинг достаточно критичный и не всегда заметный, по моему мнению. Я тяжело себе представляю, в каком случае возврат ссылки на локальную переменную вообще является корректным использованием механизма ссылок.
Да, ошибка весьма распространенная. Подобное улучшение языка было бы весьма полезным.
Да, ошибка весьма распространенная. Подобное улучшение языка было бы весьма полезным.
Ранее в одном из Телеграм чатов по С++ с Антоном обсуждали такое предложение (поверхностно), но не смогли придумать хорошую формулировку. Возможно, сейчас получится :)
Есть много спорных моментов в языке, без которых C++ был бы проще в разработке и поддержке менее квалифицированными разработчиками.
У меня похожее предложение #476, суть которого даже объяснить не каждому получается. В тоже время этот UB я встречал на каждом из проектов.
Возможно, эти части стандарта упрощали разработку компилятора или потребление его ресурсов, но в современных реалиях они слишком удорожают разработку, усложняют кривую обучения и формируют некачественную репутацию языку.
В голову пришёл интересный случай: локальный объект имеет неявный каст к Ty&
и возвращает ссылку на некоторое содержимого, хранящееся не в самом объекте. С учётом невозможности полноценного анализа lifetime в современном C++ получим множество false-positive.
В голову пришёл интересный случай: локальный объект имеет неявный каст к
Ty&
и возвращает ссылку на некоторое содержимого, хранящееся не в самом объекте. С учётом невозможности полноценного анализа lifetime в современном C++ получим множество false-positive.
А можно пример какой-то минимальный-реалистичный?
я так понял что предложение только про локальные переменные? а мемберы - это уже вне скоупа
Да, речь про локальные переменные. Отслеживать мемберов проблематично, конечно, без лайфтайм системы.