2

我想知道为什么' 的部分专业化存在以下operator<<重载:basic_ostreamchar

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 );

为什么我想知道

我发现重载充其量是多余的,而且通常很麻烦:

  1. 以下非专用模板类型的重载已经存在,并提供了charandchar*功能:

    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 );
    
  2. signed char并且unsigned char不是字符类型,(它们没有char_traits,)并且它们应该可以用作整数值,(尤其是在 , 等的上下文stdint.h中)但是这些重载与这两个点形成对比;一个人必须玩游戏来解决这些烦恼,例如:int8_tuint8_t

    • 为每个用例 显式signed char转换为signed shortunsigned chartounsigned shortsigned char*or unsigned char*to 。void*
      • 这需要用户代码中的解决方法功能重载或模板部分专业化。
    • 使用wchar_t等价物basic_ostream来避免这些不希望的函数重载。
      • 这可能会降低用户代码的性能。

    在这两种情况下,用户代码看起来都比实际需要的更难看。

4

2 回答 2

1

char 特征和各种 char 重载不相关。

char 特征与输出流的 char 类型和处理有关,而 char 重载与插入的 char 类型有关。例如,想想basic_ostream<wchar_t>operator<<(basic_ostream, char)

您还必须考虑它是实现定义的,无论普通 char 是signed还是unsigned. 还

3.9.1 基本类型 [basic.fundamental]
1 ...普通字符、有符号字符和无符号字符是三种不同的类型。

因此,过载只是charconst char*不涵盖所有可能性。我想,定义这些重载只是为了完整并涵盖所有基本类型。

于 2013-02-19T16:23:05.627 回答
1

重载对于允许在不指定所有模板类型的情况下使用运算符是必要的。如果类型匹配,编译器只使用正确的重载。如果它们不匹配,它要么必须进行隐式转换(不受欢迎),要么你必须明确指定所有模板类型,我什至不确定是否有语法可以让你这样做。

于 2013-02-19T16:15:33.660 回答