Ответ 1
В набор вставки для std::basic_ostream
входят частичные специализации для вставки char
, signed char
, unsigned char
и т.д. в потоки basic_ostream<char, ...>
. Обратите внимание, что эти специализации становятся доступными только для потоков basic_ostream<char, ...>
, а не для потоков basic_ostream<wchar_t, ...>
или потоков на основе любого другого символьного типа.
Если вы переместите эти независимые шаблоны в основное определение basic_ostream
, они станут доступны для всех форм специализации basic_ostream
. По-видимому, авторы библиотеки хотели предотвратить это.
Я действительно не знаю, почему они хотели ввести эти специализации поверх более общих
template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,
char);
но, видимо, у них были свои причины (оптимизация?).
Такая же ситуация существует для вставки C-строк. В дополнение к более универсальному вставке
template<class charT, class traits>
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,
const char*);
спецификация библиотеки также объявляет более конкретную
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&,
const char*);
и т.д.