ref-qualified operator () for lambda closure classes

webreh
webreh

Стандарт C++11 расширяет объявление non-static member functions понятием ref-qualifier, который влияет на возможность вызова соответствующей функции по lvalue reference и rvalue reference, тем самым обязывая вызывающего указать ссылку на постоянный или временный объект. Для operator() синтезированных лямбда-классов указание ref-qualifier невозможно.

Предлагается дополнить синтаксис лямбда-выражений указанием ref-qualifier. Наиболее очевидным кажется синтаксис с указанием после опционального спецификатора mutable/constexpr

[captures] <tparams> (params) specifiers ref-quailifier exception attr {}

Использование: например, для лямбда-выражений с захватом MoveConstructible объектов и последующей однократной сборкой результирующего объекта максимально естественным является указание operator() как &&.

0
рейтинг
5 комментариев
Antervis
ref-qualifier нужен для выполнения перегрузок. Лямбды не поддерживают перегрузки. Это может быть актуально только после введения в стандарт P0051 - generic overload function, но и даже в этом случае ref-qualifier лучше задавать в виде шаблонного параметра/аргумента overload, а не сигнатуры лямбды
Antervis
Andrey Davydov
> ref-qualifier нужен для выполнения перегрузок
Не только. Еще, если я хочу чтобы тот кто будет вызывать мою лямбду сделал это не больше одного раза (что очень естественно для callback'ов). Т.е. я хочу чтобы мою лямбду можно было вызвать из такой функции
template<typename F> void invoke_once(F && f) { std::move(f)(); }
но нельзя было бы из такой:
template<typename F> void invoke(F && f) { f(); }
Andrey Davydov
webreh
Antervis, ref-qualifier и const нужен не для выполнения перегрузок, а для указания характера передачи формального параметра в *this. Например, для внешней функции для std::unique_ptr<int> detach(some&& object) { return std::move(object.inner_); } точная запись будет struct some { std::unique_ptr<int> detach() && { return std::move(inner_); } std::unique_ptr<int> inner_; };
webreh
Antervis
webreh, я так полагаю, вы хотите чтобы ref-qualifier && указывал, что лямбда может выполняться только однократно?
Antervis
webreh
Antervis, да, мне кажется, что это наиболее естественное в текущем языке указание однократного выполнения функции.
webreh
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).