Рассмотрим следующий пример:
#include <cassert>
struct S {
auto func() { return +[](S &s) { s.x++; }; }
int get() { return x; }
private:
int x{0};
};
int main() {
S s;
s.func()(s);
assert(s.get() == 1);
}
Он компилируется как с G++, так и с clang, поэтому я склонен ожидать, что это допустимо стандартом. Тем не менее, лямбда не имеет списка захвата, и она не может иметь ее из-за +
которая вынуждает преобразование к указателю функции. Поэтому я ожидал, что ему не разрешат доступ к частным данным S
Вместо этого он ведет себя более или менее, как если бы он был определен как статическая функция-член.
Все идет нормально. Если бы я знал это раньше, я бы часто использовал этот трюк, чтобы избежать написания избыточного кода.
То, что я хотел бы знать сейчас, - это то, где в стандарте (рабочий проект в порядке) это определено, поскольку я не смог найти раздел, пулю или что-то еще, что об этом говорит.
Есть ли какое-либо ограничение для лямбда или оно работает точно так, как если бы оно было определено как статическая функция-член?