Question

Disons que j'ai une fonction:

typedef std::vector<int> VecType;
VecType randomVector();

int processing()
{
    VecType v = randomVector();
    return std::accumulate(v.begin(), v.end(), 0);
}

Est-ce que C ++ 0x dire spécifiquement la copie parasite sera évitée de la valeur de retour de randomVector? Ou bien un compilateur besoin de mettre en œuvre le RVO? Il me semble que la randomVector() de valeur doit être traitée comme une rvalue, et donc le constructeur de déplacement de v doit être appelé, mais je ne suis pas tout à fait sûr que ce soit vrai.

Était-ce utile?

La solution

La règle est la suivante

  • Si le compilateur peut faire RVO, il est autorisé à le faire, et aucune copie et aucun mouvement est fait.
  • Dans le cas contraire, le constructeur approprié est prise.

Comme vous dites, le temporaire est une rvalue, et donc le constructeur de déplacement est sélectionné, en raison d'une règle dans 13.3.3.2/3, qui dit qu'une référence rvalue se lie à un rvalue mieux qu'une référence lvalue. Pour décider d'utiliser ou non le déménagement ou le constructeur de copie, la résolution de surcharge à cet effet préférer le constructeur de déplacement.

La règle que le compilateur est autorisé à effectuer RVO est écrit à 12.8/15.

Autres conseils

Toutes les valeurs de retour sont considérées comme rvalues si le compilateur ne met pas en oeuvre RVO sur ce cas, il doit utiliser le constructeur de déplacement plutôt que le constructeur de copie.

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