为什么`is_open()`非const?

时间:2012-07-13 08:14:41

标签: c++ ofstream

我有一个类似于下面的函数,它是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 ( );

(即非常数)

对我来说,像这样的函数 - 显然是一个纯粹的存取器 - 似乎有点奇怪 - 应该是非常量的。背后的逻辑是否合理?

3 个答案:

答案 0 :(得分:21)

事实上,在C ++ 11中它是const。 C ++ 03版本是一个不幸的错误。

答案 1 :(得分:13)

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

答案 2 :(得分:-1)

  • 让我们看一下CPPReference,is_open()的内容是什么:
  

如果以前调用过,则流与文件关联   成员打开成功或者对象是否成功构建   使用参数化构造函数,并且尚未调用close   因为

因此,请在open() / close()之后立即使用它。这就是旧is_open()非常数的原因。 ;)

  • 请改用bool good() const