我想知道为什么 operator<<
的{{1}}部分专业化存在以下basic_ostream
重载:
char
为什么我要知道:
我发现过载最多是多余的,而且通常很麻烦:
已存在以下非专业模板类型的重载,并提供template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
char ch );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
signed char ch );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
unsigned char ch );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
const char* s );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
const signed char* s );
template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,traits>& os,
const unsigned char* s );
和char
功能:
char*
template< class CharT, class Traits>
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
CharT ch );
template< class CharT, class Traits>
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
char ch );
template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
const CharT* s );
template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os,
const char* s );
和signed char
不是字符类型,(它们没有unsigned char
),它们应该可以用作整数值,(特别是在char_traits
,stdint.h
等的int8_t
背景。然而,这些重叠与这两点形成鲜明对比;一个人必须玩游戏来解决这些烦恼,例如:
uint8_t
投放到signed char
,signed short
投放到unsigned char
,unsigned short
或signed char*
投放到unsigned char*
-案件。
void*
等效wchar_t
来避免这些不需要的函数重载。
在这两种情况下,用户代码看起来都比它需要的更加粗糙。
答案 0 :(得分:1)
必须使用重载才能在不指定所有模板类型的情况下使用运算符。如果类型匹配,编译器只使用正确的重载。如果它们不匹配,则要么必须进行隐式转换(不合需要),要么必须明确指定所有模板类型,我甚至不确定是否存在允许您这样做的语法。
答案 1 :(得分:1)
char特征和各种char重载无关。
char特征是关于char类型和输出流的处理,而char重载与char类型插入有关。例如,可以考虑basic_ostream<wchar_t>
与operator<<(basic_ostream, char)
。
您还必须考虑它是实现定义的,普通字符是signed
还是unsigned
。还
3.9.1基本类型[basic.fundamental]
1 ... Plain char,signed char和unsigned char是三种不同的类型。
因此,仅char
或const char*
的重载并未涵盖所有可能性。我想,定义这些重载只是为了完成并覆盖所有基本类型。