Ich stolperte über dieses Stück Code:„kleiner als“ Vergleich auf ifstream mit GCC 4 gegen 6
std::string export_str = "/path/to/file";
std::ofstream export(export_str.c_str());
if (export < 0) {
std::cout << "Unable to export" << std::endl;
return -1;
}
Dies kompiliert und läuft gut mit GCC 4.9.3 aber auf GCC 6.1.1 diese Fehler aufgeht:
error: no match for ‘operator<’ (operand types are ‘std::ofstream {aka std::basic_ofstream<char>}’ and ‘int’)
if (export < 0) {
~~~~~~~~~~~^~~
ich versuchte GCC 6 mit:
-std=c++98
(nicht kompiliert)
-std=c++03
(nicht kompiliert)
-std=c++11
(nicht nicht Kompilierung)
Edit: jedoch in GCC 4 kompiliert es nach wie vor mit -std=c++11
. Diese spezifische Tatsache wird auch in der Antwort unten erklärt. :)
Also ich denke, es gab eine Änderung in der Norm diesbezüglich.
Nach einigen Recherchen änderte ich den Code:
std::string export_str = "/path/to/file";
std::ofstream export(export_str.c_str());
if (export.fail()) { // <-- related change
std::cout << "Unable to export" << std::endl;
return -1;
}
Dies kompiliert und läuft gut, aber ich habe nicht eine gute Erklärung für diese Änderung, wahrscheinlich wegen nicht kommt mit einer guten Suchbegriff Kombination finden.
Also meine Frage ist nicht "Wie Gültigkeit von Ofstream überprüfen". Es gibt schon einige mehr oder weniger befriedigende Antworten ("mehr oder weniger", weil das Thema etwas kompliziert erscheint).
Here oder here oder here.
Meine Frage ist für eine Erklärung für die Änderung, die zwischen GCC 4 und GCC 6 bezüglich der Kompilierung von Sachen wie (export < 0)
im obigen Code gemacht wird.
Vielen Dank für alle Hinweise.
Was erwarten Sie von 'export <0'? – juanchopanza
der dumme Mensch schrieb 'if (export <0)' anstelle des C-ish 'if (export)' Konstrukts - es ist nicht nur verschleiert, sondern auch länger; warum haben sie das gemacht, werden wir wahrscheinlich nie wissen ... – vaxquis
Darf ich Sie nur ermutigen, keine Variable namens export zu erstellen? In C++ 11 ist es nicht verwendet, aber es ist immer noch reserviert. –