簡體   English   中英

“不到”ifstream與GCC 4對6的比較

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM