Подтвердить что ты не робот

Есть ли разница между [& foo] {...} захватом и [foo] {...} захватом, если 'foo' является ссылочной переменной?

Для foo, объявленного как Foo& foo = ...;, существует ли разница между захватом по значению и семантикой захвата по ссылке для lambdas?

4b9b3361

Ответ 1

Да, есть разница.

§5.1.2 [expr.prim.lambda] p14

Объект захватывается копией, если он неявно зафиксирован, а значение по умолчанию - = или если оно явно захвачено с захватом, который не включает &. Для каждого объекта, захваченного копией, в типе закрытия объявляется неназванный нестатический элемент данных. Порядок объявления этих членов не указан. Тип такого элемента данных - тип соответствующего захваченного объекта, если объект не является ссылкой на объект, или ссылочный тип в противном случае.

Итак, если вы фиксируете идентификатор, который присваивает ссылку по значению, вы получаете копию ссылочного объекта.

Ответ 2

Я думаю, вы попали в общее заблуждение... ссылки - это псевдонимы для реальных объектов. После инициализации любое использование ссылки в точности эквивалентно использованию исходного объекта. Если вы считаете это, вопрос имеет мало смысла. Если ссылкой является объект, то поведение [foo](){} будет точно таким же, независимо от того, является ли foo объектом или ссылкой на объект.