Warum kann ich std::ofstream nicht verschieben?

Lesezeit: 2 Minuten

Warum kann ich stdofstream nicht verschieben
Zahn

Wenn man sich frühere Antworten auf SO ansieht, scheint es, dass während std::ostream ist nicht beweglich, std::ofstream sollte sein. Aber dieser Code

#include <fstream>

int main()
{
    std::ofstream ofs;
    std::ofstream ofs2{std::move(ofs)};
}

scheint in keiner Version von gcc oder clang zu kompilieren, die ich ausprobiert habe (entweder mit –std=c++11 oder –std=c++14). Der Compilerfehler variiert etwas, aber hier ist, was ich für gcc 4.9.0 bekomme

6 : error: use of deleted function 'std::basic_ofstream::basic_ofstream(const std::basic_ofstream&)'

Ist dies das erwartete Verhalten nach dem Standard?

Beachten Sie, dass zuvor eine sehr ähnliche Frage gestellt wurde ( Ist std::ostream verschiebbar? ), aber der Standard scheint sich seitdem geändert zu haben (wie in Warum kann std::ostream nicht verschoben werden? ), wodurch diese Antworten veraltet sind. Sicherlich erklärt keine dieser Antworten, warum der obige Code nicht kompiliert wird.

Ist auf dieses Problem gestoßen, als ich versucht habe, Container von . zu verwenden ofstream, was aus den oben genannten Gründen nicht funktioniert.

  • kompiliert gut mit Clang 3.4.1 auf freebsd mit –std=c++11.

    – jbruni

    27. Februar ’15 um 23:04

Warum kann ich stdofstream nicht verschieben
vsoftco

Nach der Norm

27.9.1.11 basic_ofstream-Konstruktoren

oder, seine “leserliche” Version http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream , std::basic_ostream<> verfügt über einen Move-Konstruktor, sodass der Code kompiliert werden sollte.

clang++ 3.5 kompiliert es mit -std=c++11 oder -std=c++1y. Auch gcc5 kompiliert es, daher ist es wahrscheinlich nicht in libstdc++ implementiert für gcc < 5

Interessanterweise wird der Mangel an Bewegungssemantik in der stdlibc++-Implementierung von gcc nicht erwähnt https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014

Sehen https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316 für einen Fehlerbericht, danke an @BoBTFish für den Hinweis. Es wird bestätigt, dass das Problem in gcc5 behoben wurde.

  • gcc.gnu.org/bugzilla/show_bug.cgi?id=54316 Beachten Sie, dass es oben nur erwähnt wird stringstream, aber weiter unten wird klar, das gilt auch für ofstream. Und der unterste Eintrag ist “Fixed for GCC 5”.

    – BoBTFish

    27. Februar ’15 um 23:06


  • Nun, das scheint ziemlich endgültig zu sein. Hatte gcc5 nicht ausprobiert, aber mit Clang 3.5 versucht gcc.godbolt.org und es hat nicht funktioniert, vermute, dass es ein Problem mit dieser Site ist. Danke für deine Antwort!

    – Zahn

    27. Februar ’15 um 23:18


  • @toth Wenn ich nur auf deinen Code im Link schaue, sehe ich, dass du ihn verwendest std::is_lvalue_reference_v. AFAIK, das gibt es nicht using in C++11/14, also müssen Sie verwenden std::is_value_reference<U>::value. Ich weiß, sie hätten es definieren sollen, ähnlich wie bei den Typenmerkmalen _t (von <>::type)

    – vsoftco

    28. Februar ’15 um 2:03


.

314490cookie-checkWarum kann ich std::ofstream nicht verschieben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy