sizeof
указателя на метод? 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
указателя на метод?