明らかに、ストリームはコピーできません。ストリームを移動できるはずです。 27.9.1.11 [ofstream.cons]段落4によると、std::ofstream
を移動することができます(std::ifstream
、std::fstream
、およびstd::*stringstream
バリアントについても同じことが言えます)。例えば:
#include <iostream>
#include <fstream>
#include <string>
std::ofstream makeStream(std::string const& name) {
return std::ofstream(name);
}
int main()
{
std::ofstream out{ makeStream("example.log") };
}
std::ostream
を移動しようとすると、たとえば、引数として渡されたURNに従ってstd::ofstream
、std::ostringstream
、またはその他のストリームを作成するファクトリ関数を作成しようとしても機能しません。 std::ostream
(まあ、クラステンプレートstd::basic_ostream
は本当に)には、27.7.3.1 [ostream]に従ってprotected
移動コンストラクターがあります。
std::ostream
自体を移動できないのはなぜですか?
もともとそれらは移動可能でした。これは私の側の設計上の欠陥であることが判明し、Alberto GaneshBarbatiによって発見されました。
http://cplusplus.github.io/LWG/lwg-defects.html#911
この問題は、ostream
が移動および/または交換されるいくつかの例を示しており、予想ではなく驚くべき結果が得られます。私は、これらのタイプがこの問題によって公に移動可能または交換可能であってはならないと確信していました。