【问题标题】:"less than" Comparison on ifstream with GCC 4 vs. 6“小于”ifstream 与 GCC 4 与 6 的比较
【发布时间】: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 的有效性”。已经有一些或多或少令人满意的答案(“或多或少”,因为问题似乎有点复杂)。
Hereherehere

我的问题解释 GCC 4 和 GCC 6 之间关于在上述代码中编译 (export &lt; 0) 等内容所做的更改。

感谢您的任何指点。

【问题讨论】:

  • 你认为export &lt; 0 是什么意思?
  • 愚蠢的人写了if (export &lt; 0) 而不是C-ish if (export) 构造——它不仅被混淆了,而且更长;他们为什么这样做,我们可能永远不会知道......
  • 我强烈建议您不要创建名为 export 的变量。在 c++11 中它是未使用的,但它仍然是保留的。
  • @juanchopanza:我没有写代码。在我看来,它就像 C-ish C++98 代码。我认为这是长度(词汇比较)。但我没有对此进行调查,因为如果编译器不喜欢它,那么我也不喜欢它。 :)
  • @juanchopanza:我愿意。我正在尝试解决这样的问题,并且总体上使代码现代化......我只是想了解那些似乎没有意义的事情。

标签: c++ c++11 gcc


【解决方案1】:

在 C++11 之前,标准流可隐式转换为 void*NULL 表示坏流,非NULL 表示好流。

所以你得到的是(void*)export(void*)0 之间的指针比较,这既是合法的(在“应该编译” 的意义上)也是无意义的。

在 C++11 中,到void* 的流转换被替换为到bool 的显式转换,这仍然允许像以前一样检查流的状态,但会使诸如您的无意义代码非法。

这里重要的是从隐式转换到显式转换顺便说一句。如果到bool 的新转换是隐式的,则代码仍将编译并进行(bool) export &lt; 0 比较。但是对于显式转换,这将需要强制转换。


关于 gcc4 和 gcc6 的区别:libstdc++ 4.x 中的流在这方面不符合 C++11。 C++11 流转换,以及 C++11 的一些缺点,包括流的移动语义和 SSO,在版本 5 中得到修复/实现。

gcc4 只是不完整的 C++11 功能,在这种情况下,它遵循不应该的旧规则。


为了完整起见:正如 cmets 中已经提到的,export 是一个关键字,不应用作名称。

【讨论】:

  • 谢谢,这向我解释了。关于 GCC 4 的 C++11 功能不完整性,我可能会补充一点,确实使用 g++-4.9 -std=c++11 旧代​​码确实可以编译。我忘了在我的问题中说明这一点。
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2017-01-03
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多