56 votes

Pourquoi ne peut-std::ostream être déplacé?

Clairement, les flux ne peuvent pas être copiés. Il devrait être possible de déplacer les ruisseaux. Selon 27.9.1.11 [ofstream.contre] le paragraphe 4, il est possible de se déplacer en construire une std::ofstream. Par exemple:

#include <iostream>
#include <fstream>

std::ofstream makeStream(std::string const& name) {
    return std::ofstream(name);
}

int main()
{
    std::ofstream out{ makeStream("example.log") };
}

En essayant de déplacer un std::ostream, par exemple, d'avoir une usine d'une fonction qui crée un std::ofstream, une std::ostringstream, ou certains autres flux selon une URNE passé un argument qui ne fonctionne pas. std::ostream (ainsi, le modèle de classe std::basic_ostream vraiment) a un protected constructeur de déplacement selon 27.7.3.1 [ostream].

Pourquoi ne peut - std::ostream être déplacé lui-même?

58voto

Howard Hinnant Points 59526

À l'origine, ils étaient mobiles. Ceci s'est avéré être un défaut de conception au niveau de ma part, et découvert par Alberto Ganesh Barbati:

http://cplusplus.github.io/LWG/lwg-defects.html#911

La question montre quelques exemples de cas où l' ostream est déplacé et/ou échangées, et les résultats sont surprenants, au lieu d'attendre. J'ai été convaincu que ces types ne doivent pas être publiquement mobiliers, ni remplaçables à chaud par ce problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X