You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::istream默认初始化及Token_stream无默认构造却能实例化的疑问

问题解答

关于Token_stream默认初始化的疑问

你观察得很准确——书中给出的代码片段确实省略了默认构造函数的实现。根据C++规则,当类显式定义了其他构造函数(比如这里的两个带参构造函数),编译器不会自动生成默认构造函数,直接写Lexer::Token_stream is;会触发编译错误。

结合注释里“默认从cin读取”的描述,作者应该是省略了如下默认构造函数的实现:

Token_stream() : ip{&std::cin}, owns{false} {}

这个构造函数会把成员指针ip指向全局的std::cin,同时将owns设为false(因为我们不拥有std::cin的所有权,不能随意销毁它)。书中为了聚焦头文件组织与全局变量初始化的核心主题,简化了代码片段,没有写出这个构造函数。

关于std::istream的默认初始化规则

  • std::istream本身没有默认构造函数,无法直接通过std::istream is;的方式创建对象,这样写会导致编译失败。
  • 要创建合法的std::istream对象,必须将其绑定到一个底层的流缓冲区(std::streambuf)。比如预定义的全局对象std::cin已经绑定了标准输入的缓冲区;如果要自定义,通常会使用继承自std::istream的std::ifstream打开文件,或者手动关联一个streambuf实例。
  • 需要注意的是,std::istream的指针或引用可以被默认初始化:全局/静态作用域下的std::istream* ip;会被初始化为空指针,而局部作用域下的则是未定义值,但这和std::istream对象本身的初始化规则是不同的概念。

内容的提问来源于stack exchange,提问作者Edmond Dantes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:08:12