2016-01-20 2 views
3

J'utilise la méthode "emplace" pour éviter la copie de la mémoire. Mais, quand j'utilise le "emplace" dans une fonction Lambda. Il appelle toujours le constructeur de mouvement implicite. Comment puis-je éviter la copie de mémoire dans une fonction Lambda? Ce programme d'échantillonnage ne doit pas imprimer « Je suis déplacé. »Comment puis-je éviter le constructeur de mouvement implicite dans une fonction lambda?

#include <vector> 
#include <iostream> 

struct A 
{ 
    int a; 

    A(int t) : a(t) 
    { 
     std::cout << "I am being constructed.\n"; 
    } 
    A(A&& other) : a(std::move(other.a)) 
    { 
     std::cout << "I am being moved.\n"; 
    } 
}; 

std::vector<A> g_a; 

int main() 
{ 
    std::cout << "emplace_back:\n"; 
    g_a.emplace_back(1); 

    std::cout << "emplace_back in lambda:\n"; 
    auto f1 = [](int x) { g_a.emplace_back(x); }; 
    f1(2); 

    std::cout << "\nContents: "; 
    for (A const& t : g_a) 
     std::cout << t.a << " "; 
    std::cout << std::endl; 
} 

Répondre

6

Il n'est pas sur la fonction lambda, mais plutôt sur le vecteur qui réaffecte sa mémoire. Vous pouvez ammend ceci avec std::vector::reserve.

int main() { 
    g_a.reserve(10); 
    ^^^^^^^^^^^^^^^^ 
    std::cout << "emplace_back:\n"; 
    g_a.emplace_back(1); 

    std::cout << "emplace_back in lambda:\n"; 
    auto f1 = [](int x) { g_a.emplace_back(x); }; 
    f1(2); 

    std::cout << "\nContents: "; 
    for (A const& t : g_a) 
     std::cout << t.a << " "; 
    std::cout << std::endl; 
} 

Live Demo

+0

Je l'ai Merci. – user5814611