Exemple:
#include <functional>
int main() {
auto test = []{};
test = []{};
return 0;
}
Ce émet le message d'erreur suivant dans 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()>&'
À partir de la norme 5.1.2.3 (l'emphase est mienne):
Une mise en œuvre peut définir la fermeture type différemment de ce qui est décrit ci-dessous à condition que cela ne modifie pas les comportements observables de l'autre programme que par l'évolution de:
- la taille et/ou l'alignement de la fermeture type,
- si la fermeture est de type trivialement copiable (Clause 9)
- si la fermeture est de type standard-classe de mise en page (Clause 9), ou
- si le type de fermeture est un module de classe (article 9).
Aussi loin que je peux dire, c'est ce que je suis en cours d'exécution. Il est tentant d'utiliser un supprimée opérateur d'affectation et de l'échec. Je suis curieux de savoir si il y a une solution facile, et plus largement de quoi le motiver raison pour permettre la copie constructibility être omis pour les lambdas en général.