【问题标题】:Why is `is_open()` non-const?为什么`is_open()` 是非常量的?
【发布时间】:2012-07-13 08:14:41
【问题描述】:

我有一个类似于下面的函数,它是 const 并且需要在继续之前检查文件流是否打开:

bool MyClass::checkSomeStuff() const
{
    // Where outputFile_ is a std::ofstream
    if ( ! outputFile_.is_open() )
    {
        throw std::runtime_error( "Output file not open." );
    }

    // ... do more stuff

但是,我似乎不能这样做,因为 is_open() 被声明为:

bool is_open ( );

(即非常量)

对我来说,像这样的函数(显然是纯访问器)应该是非常量的,这似乎有点奇怪。背后是否有合理的逻辑?

【问题讨论】:

  • const 流可以做什么?
  • 在这里就这个主题进行很好的讨论:gcc.gnu.org/ml/libstdc++/2004-08/msg00105.html
  • @Nim:可能不多,但这不是重点。关键是检查流是否打开的操作不应该在逻辑上改变它——它只是一个检查。我的 checkSomeStuff 函数是并且应该是 const - 它是一个访问器。我不希望它是非常量纯粹因为is_open() 是非常量 - 这似乎不对。
  • 如果您的编译器没有实现库 DR 365,您可以改用 outputFile.rdbuf()->is_open()

标签: c++ ofstream


【解决方案1】:

实际上是 C++11 中的const。 C++03版本是个不幸的错误。

【讨论】:

    【解决方案2】:

    这是标准库中的一个已知差异。您可以在此处找到有关它的更多信息: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#365

    【讨论】:

      【解决方案3】:
      • 让我们看看 CPPReference,is_open() 是什么:

      如果先前调用 成员打开成功或对象是否构造成功 使用参数化的构造函数,并且 close 没有被调用 从那时起。

      所以,在open() / close() 之后立即使用它。这就是为什么旧的 is_open() 非常量。 ;)

      • 请改用bool good() const

      【讨论】:

      • 等等... 在open()close() 之后使用它意味着它应该是非const 吗?
      • @devidark:不幸的是,good() 在这里不是一个可行的替代品,因为它无法突出显示 (a) 文件尚未打开或 (b) 已成功打开和关闭。
      • @quasiverse: 因为open()/close() 是修改流的状态。 @Component 10:同意你的看法。但是,如果您的代码符合要求,那么bool good() const 就足够了。 ;)
      • @devidark 是,但is_open() 不会修改流的状态...(?)
      • @quasiverse:如果旧的is_open() 不是const,那么它就得不到保证。不是吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      相关资源
      最近更新 更多