Question Dans lambda, comment la référence est capturée par la valeur


Si la variable de type de référence est capturée dans lambda par valeur, est-il capturé par référence ou valeur?

Petit échantillon avec la question:

#include <iostream>

struct Test {
  int a;
};

void testFunc(const Test &test) {
  auto a = [=] {
    // does 'test' is being passed to closure object with copy
    // or by reference?
    return test.a;
  } ();
  std::cout << a;
}

int main() {
  Test test{1};
  testFunc(test);
}

28
2017-10-30 07:41


origine


Réponses:


Par valeur Exemple compilable:

class C
{
public:
    C()
    {
        i = 0;
    }

    C(const C & source)
    {
        std::cout << "Copy ctor called\n";
        i = source.i;
    }

    int i;
};

void test(C & c)
{
    c.i = 20;

    auto lambda = [=]() mutable {

        c.i = 55;
    };
    lambda();

    std::cout << c.i << "\n";
}

int main(int argc, char * argv[])
{
    C c;
    test(c);

    getchar();
}

Résultat:

Copier le nom de ctor
20

Je suppose que ce paragraphe de la norme C ++ s'applique:

5.1.2 Expressions Lambda

(...) 14. Une entité est capturée par copie s'il est implicitement capturé et le capture-défaut is = ou si c'est explicitement capturé avec une capture qui ne comprend pas un &. Pour chaque entité capturée par copie, un nonstatic non nommé membre de données est déclaré dans le type de fermeture. L'ordre de déclaration de ces membres n'est pas spécifié. Le type d'un tel membre de données est le type de l'entité capturée correspondante si l'entité n'est pas un référence à un objet, ou le type référencé sinon. [ Remarque: Si l'entité capturée est une référence à un fonction, le membre de données correspondant est également une référence à une fonction. -note de fin]

Cela a du sens - si des variables locales sont passées par valeur et que le paramètre passé par référence "agit" en tant que variable locale en fonction, pourquoi serait-il transmis par référence plutôt que par valeur?


25
2017-10-30 07:44