Bonjour
Je suis de la team "const autant que possible". Donc, dès que je vois une déclaration de variable à laquelle je peux ajouter const, je le fais.
Je fais une exception à cette règle : quand je stocke une lambda expression, je n'ajoute jamais const. Je fais auto foo = []() {}; et non const auto foo = []() {};.
Pourtant, en suivant la logique "const autant que possible", je devrais aussi utiliser const dans cette situation.
Comment faites-vous ? auto ou const auto pour les lambdas ? Pourquoi ?
PS : pour celles et ceux qui ne savent pas, on ne peut changer la valeur de la variable :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int main() { auto f = []() {}; f = []() {}; }EDIT : on peut produire un exemple où le typage correspond et où l'affectation est quand même rejetée (de toute façon, c'est pas un cas très utile) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <source>:3:7: error: no viable overloaded '=' 3 | f = []() {}; | ~ ^ ~~~~~~~ <source>:2:14: note: candidate function (the implicit copy assignment operator) not viable: no known conversion from '(lambda at <source>:3:9)' to 'const (lambda at <source>:2:14)' for 1st argument 2 | auto f = []() {}; | ^ 1 error generated. Compiler returned: 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int main() { auto f = []() {}; auto g = f; f = g; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <source>:4:6: error: object of type '(lambda at <source>:2:14)' cannot be assigned because its copy assignment operator is implicitly deleted 4 | f = g; | ^ <source>:2:14: note: lambda expression begins here 2 | auto f = []() {}; | ^
Partager