Пример:
#include <functional>
int main() {
auto test = []{};
test = []{};
return 0;
}
В gcc 4.7.2 выдается следующее сообщение об ошибке:
test.cpp: In function ‘int main()’:
test.cpp:5:13: error: no match for ‘operator=’ in ‘test = <lambda closure object>main()::<lambda()>{}’
test.cpp:5:13: note: candidate is:
test.cpp:4:16: note: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
test.cpp:4:16: note: no known conversion for argument 1 from ‘main()::<lambda()>’ to ‘const main()::<lambda()>&’
Из стандарта 5.1.2.3 (акцент мой):
Реализация может определять тип закрытия иначе, чем описано ниже, если это не изменяет наблюдаемое поведение программы, кроме как меняя:
- размер и/или выравнивание типа закрытия,
- существует ли тип закрытия тривиально скопируемый (раздел 9)
- является ли тип закрытия стандартным классом макета (раздел 9) или
- является ли тип замыкания классом POD (раздел 9).
Насколько я могу судить, это то, с чем я столкнулся. Он пытается использовать удаленный оператор присваивания и не работает. Мне любопытно узнать, есть ли легкое обходное решение, и в более широком смысле, что мотивирующее обоснование для того, чтобы позволить конструкцию копирования быть опущено для лямбда вообще.