The cppreference shows that there are different rules for lambda closure type constructors.
Default Construction - Until C++14
ClosureType() = delete; (until C++14)
Closure types are not Default Constructible. Closure types have a deleted (until C++14)no (since C++14) default constructor.
Default Construction - Since C++14
Closure types have no (since C++14) default constructor.
Default Construction - Since C++20
If no captures are specified, the closure type has a defaulted default constructor. Otherwise, it has no default constructor (this includes the case when there is a capture-default, even if it does not actually capture anything).
Copy Assignment Operator - Until C++20
The copy assignment operator is defined as deleted (and the move assignment operator is not declared). Closure types are not CopyAssignable.
Copy Assignment Operator - Since C++20
If no captures are specified, the closure type has a defaulted copy assignment operator and a defaulted move assignment operator. Otherwise, it has a deleted copy assignment operator (this includes the case when there is a capture-default, even if it does not actually capture anything).
What is the reason behind this change in the rules? Did standard committee identified some short comings in the standard for lambda closure type construction? If so, what are those short comings?
See Question&Answers more detail:os