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

为何basic_istream类无模板默认参数却可单参数实例化?

为什么basic_istream<char>可以仅传入一个模板参数完成实例化?

我在查看basic_istream类的实现时,发现其类声明里没有显式声明模板默认参数,按规则实例化对象应该需要传入两个模板参数,但实际代码中仅用basic_istream<char>就能成功构建对象,比如下面的示例:

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    basic_stringbuf<char> string("Basic ios", ios_base::in | ios_base::out);
    basic_istream<char> bis(&string);
    
    return 0;
}

原理说明

  1. C++标准的强制规定
    basic_istream是C++标准库定义的模板类,标准明确要求它的第二个模板参数带有默认值,其标准定义形式为:
template <class charT, class traits = char_traits<charT>>
class basic_istream;

第二个参数默认绑定到对应字符类型的char_traits特化版本,比如char对应的就是char_traits<char>。

  1. 实现源码的省略写法
    你查看的GCC实现源码中没有显示默认参数,是因为C语法允许模板默认参数仅在第一次声明时指定。在libstdc的头文件体系里,默认参数已经在<istream>头文件的前置声明或类的首次声明中定义过了,后续的实现文件就不需要重复书写默认参数了,但编译器依然会识别并应用这个默认值。

所以当你写basic_istream<char>时,编译器会自动补全第二个模板参数为char_traits<char>,从而完成合法的类实例化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:13:11