std::string struct - Copier/problèmes d'affectation?

Supposons que j'ai une structure contenant un std::string, comme ceci:

struct userdata{
        int uid;
        std::string username;
    }

Dois-je créer une copie ctor ou quoi que ce soit de le renvoyer à partir d'une fonction ou de l'utiliser à l'intérieur d'un conteneur STL? Prenons cette fonction:

userdata SomeClass::GetUserData(unsigned int uid)
{
    //do error checking and other stuff...
    //m_usermap is std::map<unsigned int, userdata>
    return m_usermap[uid];
}

Lorsque j'insère userdata les structures dans le std::map, une copie de la structure est créée, à droite? Un nouveau std::string créés à l'aide de la valeur du champ nom d'utilisateur, ou fait une sorte de copie bit à bit arriver (ce serait mauvais)? De même, quand je retourne un userdata structure de la GetUserData méthode, a-t-elle indépendante chaîne de caractères contenant le nom d'utilisateur ou ai-je besoin de définir une copie ctor et explicitement, de créer une nouvelle chaîne?

Rappelez-vous que 'struct' et 'class' de façon interchangeable permet de définir la classe des types, avec la seule différence étant publique ou privée d'accès par défaut. (C'est une idée fausse commune, même si vous n'êtes pas directement dire que vous avez cru.) Cela signifie userdata a une copie ctor même si vous n'avez pas à déclarer explicitement un (tous classe-types ont une copie ctor), et l'généré par le compilateur on va faire un membre de la sage-copie, qui appelle à la copie ctor de chaque membre, et c'est ainsi que alemjerus la réponse ci-dessous s'applique. Tous généré par le compilateur copie ctors et l'affectation des opérateurs se comportent membres à bon escient au lieu de bit-dumbly.
En cas de doute, écrire constructeur de copie et l'affectation des opérateurs pour la struct ou class. Je préfère ne pas compter sur hidden activités du compilateur.
Je suis complètement en désaccord avec cet avis. Le compilateur génère ne le font parfaitement bien leur travail. Sauf si vous savez ce qu'ils sont en train de faire un novice va faire une erreur, tandis que quelqu'un qui ne les savent ce qu'ils font n'a pas besoin de faire quoi que ce soit. De sorte que si la classe contient un pointeur par défaut méthodes sont tout à fait bien et sans doute mieux qu'un novice pouvait écrire. En outre, moins de code, moins de coûts de maintenance.

OriginalL'auteur alanc10n | 2010-01-05