为什么C++中对const修饰的文件流使用>>运算符会报错
问题原因解析
核心原因是读取流的操作本身会修改流对象的内部状态,无法在被const修饰的流对象上执行,具体细节如下:
- C++标准库中,
std::ifstream属于输入流类std::istream的派生类,我们常用的提取运算符>>的重载实现,第一个入参始终是非常量的std::istream&类型,没有适配const std::istream&的版本。 - 读取操作必然修改流的两类内部状态:
- 流内部的读指针偏移量,用来标记下一次读取的起始位置
- 流的状态标记位(
eofbit/failbit/badbit等),用来记录是否出现读入到文件末尾、数据类型不匹配、读取失败等异常情况
- 你给参数加
const修饰后,相当于向编译器承诺该函数不会修改inputFile的任何内部状态,但>>运算符的调用会打破这个承诺,因此编译器会直接报类型不匹配的错误,禁止非const成员函数作用于const对象。 - 输入流作为参数传递时默认都不会加
const修饰,这是标准库的通用设计惯例。
内容的提问来源于stack exchange,提问作者Nadav Holtzman
相关产品推荐
相关产品推荐

