Я смотрю выступление Херба Саттера на CppCon 2014 о программировании без блокировок.
На раздаточный материал, страница 7, у нас есть следующий код:
static unique_ptr<widget> widget::instance;
static std::once_flag widget::create;
widget& widget::get_instance() {
std::call_once( create, [=]{ instance = make_unique<widget>(); } );
return *instance;
}
Мой вопрос: почему [=]
захват здесь используется, а не [&]
(или может просто []
?)
cppreference говорит:
[=]
захватывает все автоматические переменные, используемые в теле лямбды-копии, и текущий объект по ссылке, если существует
но у нас нет автоматических переменных и нам не нужен текущий объект.
Там нет необходимости для Захват по умолчанию Вот. []
будет хорошо.
Как я писал в комментариях, это непроверенный фрагмент, написанный для иллюстрации совершенно не связанной вещи (т.е. call_once
). Нет особого смысла пытаться читать слишком много в это.
Тем не менее, что касается жанра «непроверенного фрагмента, написанного для размещения на слайде», [=]
вероятно, самый безопасный вариант по умолчанию лямбда-интродьюсером: [&]
может привести к гонкам данных или висящим ссылкам, []
было бы неправильно, если вам когда-либо понадобится снимать, а явные снимки занимают ценное пространство на слайде — и требуют реального размышления о снимках ……
Других решений пока нет …