C++ 为什么getline()不';你不接受一个恒定的istream吗?

C++ 为什么getline()不';你不接受一个恒定的istream吗?,c++,constants,iostream,getline,istream,C++,Constants,Iostream,Getline,Istream,基本问题在这里,我试图学习iostream的基本知识 我被告知构建一个函数,读取常量流的行&。i、 e.验证文件(常量istream&is) 我发现我不能将函数getline()与const istream&作为第一个参数一起使用。我想知道为什么。我以为我只是在读istream,函数getline()会改变它吗 是否有可能从一个恒定的流中获取信息?流的概念是,每次向前移动其内部指针时,都会从中顺序读取一些数据。通过推进此指针,可以更改流对象。你不能从const流中读取数据(除非你const-强制

基本问题在这里,我试图学习iostream的基本知识

我被告知构建一个函数,读取常量流的行&。i、 e.验证文件(常量istream&is)

我发现我不能将函数getline()与const istream&作为第一个参数一起使用。我想知道为什么。我以为我只是在读istream,函数getline()会改变它吗


是否有可能从一个恒定的流中获取信息?

流的概念是,每次向前移动其内部指针时,都会从中顺序读取一些数据。通过推进此指针,可以更改流对象。你不能从
const
流中读取数据(除非你
const
-强制转换它们,但这是你不应该做的事情)

EDIT:实际上,我们并不关心隐藏在
istream
接口后面的实际流对象是否使用了一些“内部指针”。准确地说,重要的是,当您读取流时,流会改变其状态,因为下次读取时,您会得到不同的结果(您从流中读取下一个内容)。如果给你一个
const
对象,这意味着你不应该改变它的状态


此外,还有一个原因,就是您不能只从流中获取数据而不更改任何内容。对于文件流,下一个要从流中读取的内容甚至可能不在内存中,流对象可能必须首先从磁盘读取它,更新它的缓冲区,等等。(EDIT:但这不会改变对象的外部可见状态,因此实际上这不是一个好参数。阅读
mutable
关键字以了解更多。)

可以从
const
流获取数据,但需要通过它管理的streambuf类进行读取:

#include <sstream>
#include <iostream>
#include <cstdio>

int main()
{
    const std::istringstream strm("Const stream");
    std::streambuf* buf = strm.rdbuf();

    char c;
    while ((c = buf->sbumpc()) != EOF)
        std::cout << c;
}
#包括
#包括
#包括
int main()
{
const std::istringstream strm(“const stream”);
std::streambuf*buf=strm.rdbuf();
字符c;
而((c=buf->sbumpc())!=EOF)

std::cout
std::getline()
(以及其他I/O函数)设置底层流状态以指示解析或格式化过程中的错误。这就是流不能被
常量限定的原因。此外,
宽度()
流的某些操作后会重置。

它从流中读取一行,因此会更改其状态。@MemyselfandI您是对的,istream只是一个接口,实际文件流是否使用指向其缓冲区的指针扭结是一个实现细节。这应该被视为规范中的一个错误。-1愚蠢的投票。嗨,@JanHudec,我不同意。有一个常量流是一个BUG!(imho)。祝你有一个愉快的一天:)@jrok:有一个常量流显然没有任何意义,但是当你有一个常量流时,它不应该让你得到指向它的缓冲区的非常量指针。