int& m = getRef(); - тут ровно так же UB и, на самом деле, это чистая случайность что вывелась 5.int - это очень плохой тип для таких проверок. Измени код чтобы везде использовался std::shared_ptr<int> и посмотри что будет. Транслятор тебе даже пометил неприемлемость возврата ссылки на локальный объект.Вы хотели сказать, что нельзя возвращать из функции ссылку на временный объект?
const int& c = 5; - тут локальный временный int( 5 ) продолжит жить после инициализации локальной ссылки.for( const auto& value : Foo{}.GetValues() ) - тут локальный временный Foo{} уничтожается еще до выборки первого элемента. Ещё возник вопрос, а есть ли разница между этими вариантами? В обоих случаях c имеет один и тот же адрес.
я прогнал у себя ваш пример и у меня отладчик в цикл даже не заходит.
int main()
{
const std::vector<int>& data{ Foo{}.GetValues() };
auto current = data.begin();
auto end = data.end();
for( ; current != end; ++current )
{
const auto& value = *current;
std::cout << value << std::endl;
}
}std::vector<int>& data{ Foo{}.GetValues() }; и то, что я писал комментарием выше. Локальный временный уничтожается сразу после завершения операции.data становится висячей ссылкой. Следующая же строка уже вносит в код UB. Object (o1) воспринимается как определение объекта o1 с типом Object, а скобки в этом контексте являются уже деоптимизацией. Я представляю это так: 5 находится в области памяти, записать в которую мы ничего не можем (из-за этого мы не можем написать, допустим, 5 = a), но при этом мы можем из этой области читать.
5 - это литерал с категорией prvalue. Категория выражения говорит о том, что выражение имеет полный тип и не является полиморфным, не является массивом, лишено идентичности.5 = a приводит к ошибке трансляции.const int& c = 5;?prvalue могут использоваться для инициализации только константной ссылки, в следствии чего создается локальный временный объект с типом эквивалентным подлежащему типу ссылки. Литерал же используется для инициализации этого локального временного. Обычно локальный временный уничтожается сразу после завершения операции. Однако здесь вступает в силу продление жизни временного за счет именно инициализации константной ссылки.
sizeofуказателя на метод?