Для foo
, объявленного как Foo& foo = ...;
, существует ли разница между захватом по значению и семантикой захвата по ссылке для lambdas?
Есть ли разница между [& foo] {...} захватом и [foo] {...} захватом, если 'foo' является ссылочной переменной?
Ответ 1
Да, есть разница.
§5.1.2 [expr.prim.lambda] p14
Объект захватывается копией, если он неявно зафиксирован, а значение по умолчанию -
=
или если оно явно захвачено с захватом, который не включает&
. Для каждого объекта, захваченного копией, в типе закрытия объявляется неназванный нестатический элемент данных. Порядок объявления этих членов не указан. Тип такого элемента данных - тип соответствующего захваченного объекта, если объект не является ссылкой на объект, или ссылочный тип в противном случае.
Итак, если вы фиксируете идентификатор, который присваивает ссылку по значению, вы получаете копию ссылочного объекта.
Ответ 2
Я думаю, вы попали в общее заблуждение... ссылки - это псевдонимы для реальных объектов. После инициализации любое использование ссылки в точности эквивалентно использованию исходного объекта. Если вы считаете это, вопрос имеет мало смысла. Если ссылкой является объект, то поведение [foo](){}
будет точно таким же, независимо от того, является ли foo
объектом или ссылкой на объект.