Pourquoi est-ce que C++11 lambda besoin “mutable” mot-clé pour la capture par valeur, par défaut?

Court exemple:

#include <iostream>

int main()
{
    int n;
    [&](){n = 10;}();             //OK
    [=]() mutable {n = 20;}();    //OK
    //[=](){n = 10;}();          //Error: a by-value capture cannot be modified in a non-mutable lambda
    std::cout << n << "\n";       //"10"
}

La question: Pourquoi avons-nous besoin de la mutable mot-clé? Il est tout à fait différent du traditionnel passage de paramètres à des fonctions nommées. Quelle est la logique derrière?

J'étais sous l'impression que le point de l'ensemble de la capture-par-valeur est de permettre à l'utilisateur de modifier le temporaire -- sinon, je suis presque toujours préférable d'utiliser la capture par référence, ne suis-je pas?

Tout enlightenments?

(Je suis en utilisant MSVC2010 par la voie. Autant que je sache, ce devrait être la norme)

  • Bonne question, bien que je suis content que quelque chose est enfin const par défaut!
  • Pas une réponse, mais je pense que c'est une chose sensée: si vous prenez quelque chose en valeur, vous ne devriez pas être en train de changer juste pour vous sauver 1 copie d'une variable locale. Au moins vous ne faites pas l'erreur de changement de n en remplaçant = avec &.
  • Je suis absolument d'accord avec stefaanv. La raison en est probablement qu'ils entendaient la langue pour être plus simple à apprendre. Un débutant pourrait essayer de mettre en œuvre une fonction d'échange lambda avec la valeur de la capture. C'est ce qui est communément appelé le principe de moindre surprise.
  • Pas sûr que c'est bon, lorsque tout le reste n'est pas const par défaut.
  • Szelei: ne Pas commencer un argument, mais à mon humble avis, le concept de "facile à apprendre" n'a pas sa place dans le langage C++, en particulier dans les temps modernes. De Toute Façon 😛
  • Bjarne lui-même l'a affirmé dans parler il y a deux ans. Je ne dis pas que C++ est facile à apprendre (ni celui de C++0x est), mais ce et les références rvalue les deux semblent viser le moins surprise de principe.
  • Szelei, juste par curiosité, comment est-référence rvalue "le moins surprenant"?
  • Parce que l'utilisation de références rvalue vous pouvez transmettre des valeurs temporaires à des fonctions qui s'attendent références (qui est, les références rvalue). Avec seulement lvalue refs vous ne pouvez pas. Cela, bien sûr, repose sur la personne qui a écrit cette fonction en particulier (et à être sensible, ils écrivent une avec deux r et lvalue de surcharge). Une meilleure façon de phrase, c'est que les références rvalue autoriser les responsables de l'implémentation de l'API pour écrire moins surprenant, le code de l'API de l'utilisateur (c'est pourquoi je dis qu'il vise pour cela). Au moins c'est ma compréhension de la motivation à l'origine de ces choses.
  • "le point de l'ensemble de la capture-par-valeur est de permettre à l'utilisateur de modifier le temporaire" - Non, l'essentiel est que le lambda peut rester valable au-delà de la durée de vie de tout capturé variables. Si C++ lambdas seulement eu de la capture-par-ref, ils seraient inutilisables dans beaucoup trop de scénarios.

InformationsquelleAutor kizzx2 | 2011-03-31