为什么`is_open()`不是const的?

24

我有一个类似下面的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的,这似乎有点奇怪。它背后的逻辑有意义吗?


1
你可以用一个const流做什么? - Nim
1
这个主题在这里有很好的讨论:http://gcc.gnu.org/ml/libstdc++/2004-08/msg00105.html - Paul R
5
@Nim: 可能不多,但这并不是重点。重点在于检查流是否打开的操作不应该在逻辑上改变它——这只是一个检查。我的checkSomeStuff函数是且应该是const——它是一个访问器。我不希望它因为is_open()是非const而变成非const——这似乎不正确。 - Component 10
1
如果你的编译器没有实现库DR 365,你可以使用outputFile.rdbuf()->is_open() - Jonathan Wakely
3个回答

21

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


13

-1
让我们在 CPPReference 上看看 is_open() 是用于什么的:

如果之前调用了成员函数 open 并成功打开文件,或者使用参数化构造函数成功构造该对象且自那以来未调用 close,则流将与文件关联。

因此,在 open() / close() 后立即使用它。这就是为什么旧版的 is_open() 非 const 。;)
使用 bool good() const 代替。

等等...在open()close()之后使用它,怎么意味着它应该是非const的? - flight
@devidark:不幸的是,good()在这里不是可行的替代品,因为它无法突出显示文件是否(a)尚未打开或(b)已成功打开和关闭。 - Component 10
@quasiverse: 因为open()/close()会修改流的状态。@Component 10: 我同意你的观点。但如果你的代码是一致的,使用bool good() const就足够了。 ;) - Alex Medveshchek
@devidark 是的,但是 is_open() 不会修改流的状态...(?) - flight
@quasiverse:如果旧的 is_open() 不是 const,那么它就无法得到这个保证。不是吗? - Alex Medveshchek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接