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