Дважды проверьте шаблон блокировки — захват в лямбде передается в call_once

Я смотрю выступление Херба Саттера на 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 говорит:

[=] захватывает все автоматические переменные, используемые в теле лямбды-копии, и текущий объект по ссылке, если существует

но у нас нет автоматических переменных и нам не нужен текущий объект.

5

Решение

Там нет необходимости для Захват по умолчанию Вот. [] будет хорошо.

Как я писал в комментариях, это непроверенный фрагмент, написанный для иллюстрации совершенно не связанной вещи (т.е. call_once). Нет особого смысла пытаться читать слишком много в это.

Тем не менее, что касается жанра «непроверенного фрагмента, написанного для размещения на слайде», [=] вероятно, самый безопасный вариант по умолчанию лямбда-интродьюсером: [&] может привести к гонкам данных или висящим ссылкам, [] было бы неправильно, если вам когда-либо понадобится снимать, а явные снимки занимают ценное пространство на слайде — и требуют реального размышления о снимках ……

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]