[英]“less than” Comparison on ifstream with GCC 4 vs. 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;
}
這可以用GCC 4.9.3進行編譯和運行,但是在GCC 6.1.1上出現了這個錯誤:
error: no match for ‘operator<’ (operand types are ‘std::ofstream {aka std::basic_ofstream<char>}’ and ‘int’)
if (export < 0) {
~~~~~~~~~~~^~~
我試過GCC 6:
-std=c++98
(編譯)
-std=c++03
(編譯)
-std=c++11
( 不編譯)
編輯:但是,在GCC 4中,它仍然使用-std=c++11
編譯。 這個具體事實也在下面的答案中解釋。 :)
所以我猜這個標准有所改變。
經過一番研究后,我將代碼更改為:
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;
}
編譯並運行良好,但我沒有找到這個改變的好解釋,可能是由於沒有提出一個好的搜索詞組合。
所以我的問題不是 “如何檢查ofstream的有效性”。 已經有一些或多或少令人滿意的答案(“或多或少”因為問題似乎有點復雜)。
在這里或這里或這里 。
我的問題是解釋GCC 4和GCC 6之間關於編譯上述代碼中的(export < 0)
類的內容所做的更改。
謝謝你的任何指示。
在Pre-C ++ 11中,標准流可以隱式轉換為void*
, NULL
表示壞流,非NULL
表示流。
所以你得到的是(void*)export
和(void*)0
之間的指針比較,這是合法的(在“應該編譯”的意義上)和非感性的。
在C ++ 11中,流轉換為void*
被顯式轉換為bool
取代, bool
仍然允許像以前一樣檢查流的狀態,但是使得像你這樣的無意義代碼非法。
這里重要的是從隱式轉換到顯式轉換btw。 如果新的轉換為bool
是隱式的,代碼仍然會編譯並執行(bool) export < 0
比較。 但是通過顯式轉換,這需要強制轉換。
關於gcc4和gcc6之間的區別:libstdc ++ 4.x中的流在這方面不符合C ++ 11。 在版本5中修復/實現了C ++ 11流轉換,以及包括流和SSO的移動語義在內的相當多的C ++ 11缺點。
gcc4只是不完整的C ++ 11功能,在這種情況下,它遵循舊規則,它不應該。
為了完整起見:正如評論中已經提到的, export
是一個關鍵字,不應該用作名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.