Question

J'ai l'exemple simple suivant, dans lequel je veux appeler std::for_each sur une collection d'objets non copiables :

class A {
public:
    A() : x(0) {}
    A(const A&) = delete;

private:
    int x;
};

void func() {
    std::vector<A> v(10);
    std::map<int, A> m;

    // works as expected
    std::for_each(begin(v), end(v), [](const A& a) { /* do nothing */ });

    // error calling copy constructor
    std::for_each(begin(m), end(m), [](const std::pair<int, A>& a) { /* do nothing */ });
}

Si je mets tout dans un std::vector, cela fonctionne comme je m'y attendais, mais lorsque j'utilise un std::map, soudainement std::for_each veut appeler le constructeur de copie (supprimé).Pourquoi?J'aurais supposé que j'obtenais simplement une référence à la paire enregistrée dans la carte, sans aucune copie nécessaire.

Était-ce utile?

La solution

Le problème est que std::map a un std::pair<const Key, Value> comme type de valeur interne.Plutôt que de le spécifier explicitement, les conteneurs de la bibliothèque standard vous permettent de l'extraire du type de conteneur :

En C++11, faites (comme en C++98, mais vous devrez utiliser un objet fonction plutôt qu'un lambda à l'intérieur for_each, et utilise également typedef au lieu de using =):

using value_type = std::map<int, A>::value_type;
std::for_each(begin(m), end(m), [](value_type const& a) { /* do nothing */ });

En C++14, faites :

std::for_each(begin(m), end(m), [](auto const& a) { /* do nothing */ });

L'utilisation de auto à l'intérieur du lambda est pris en charge par Clang 3.4, Visual Studio 2013 Novembre CTP et GCC 4.9.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top