Ещё возник вопрос, а есть ли разница между этими вариантами? В обоих случаях 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 могут использоваться для инициализации только константной ссылки, в следствии чего создается локальный временный объект с типом эквивалентным подлежащему типу ссылки. Литерал же используется для инициализации этого локального временного. Обычно локальный временный уничтожается сразу после завершения операции. Однако здесь вступает в силу продление жизни временного за счет именно инициализации константной ссылки.entity.bound method для C++ не существует. У тебя там просто синтаксис нарушен в коде, поэтому трансляция и не проходит.
Любой код должен быть оформлен соответствующим образом.
Вместо этого замыленного скриншота тебе лучше предоставить код сценариев сборки проекта. Там важны настройки проекта. Еще важно знать версию студии у тебя.