web-dev-qa-db-ja.com

std :: ostreamを移動できないのはなぜですか?

明らかに、ストリームはコピーできません。ストリームを移動できるはずです。 27.9.1.11 [ofstream.cons]段落4によると、std::ofstreamを移動することができます(std::ifstreamstd::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::ofstreamstd::ostringstream、またはその他のストリームを作成するファクトリ関数を作成しようとしても機能しません。 std::ostream(まあ、クラステンプレートstd::basic_ostreamは本当に)には、27.7.3.1 [ostream]に従ってprotected移動コンストラクターがあります。

std::ostream自体を移動できないのはなぜですか?

56
Dietmar Kühl

もともとそれらは移動可能でした。これは私の側の設計上の欠陥であることが判明し、Alberto GaneshBarbatiによって発見されました。

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

この問題は、ostreamが移動および/または交換されるいくつかの例を示しており、予想ではなく驚くべき結果が得られます。私は、これらのタイプがこの問題によって公に移動可能または交換可能であってはならないと確信していました。

56
Howard Hinnant