为何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; }
原理说明
- C++标准的强制规定
basic_istream是C++标准库定义的模板类,标准明确要求它的第二个模板参数带有默认值,其标准定义形式为:
template <class charT, class traits = char_traits<charT>> class basic_istream;
第二个参数默认绑定到对应字符类型的char_traits特化版本,比如char对应的就是char_traits<char>。
- 实现源码的省略写法
你查看的GCC实现源码中没有显示默认参数,是因为C语法允许模板默认参数仅在第一次声明时指定。在libstdc的头文件体系里,默认参数已经在<istream>头文件的前置声明或类的首次声明中定义过了,后续的实现文件就不需要重复书写默认参数了,但编译器依然会识别并应用这个默认值。
所以当你写basic_istream<char>时,编译器会自动补全第二个模板参数为char_traits<char>,从而完成合法的类实例化。
内容的提问来源于stack exchange,提问作者Hardik
相关产品推荐
相关产品推荐

