【发布时间】:2016-10-04 09:39:30
【问题描述】:
我只是偶然发现了这段代码:
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 的有效性”。已经有一些或多或少令人满意的答案(“或多或少”,因为问题似乎有点复杂)。
Here 或here 或here。
我的问题是解释 GCC 4 和 GCC 6 之间关于在上述代码中编译 (export < 0) 等内容所做的更改。
感谢您的任何指点。
【问题讨论】:
-
你认为
export < 0是什么意思? -
愚蠢的人写了
if (export < 0)而不是C-ishif (export)构造——它不仅被混淆了,而且更长;他们为什么这样做,我们可能永远不会知道...... -
我强烈建议您不要创建名为 export 的变量。在 c++11 中它是未使用的,但它仍然是保留的。
-
@juanchopanza:我没有写代码。在我看来,它就像 C-ish C++98 代码。我认为这是长度(词汇比较)。但我没有对此进行调查,因为如果编译器不喜欢它,那么我也不喜欢它。 :)
-
@juanchopanza:我愿意。我正在尝试解决这样的问题,并且总体上使代码现代化......我只是想了解那些似乎没有意义的事情。