Некоторое время назад кто-то с высокой репутацией здесь, в Кару, написал в комментарии, что необходимо наложить char -argument на unsigned char перед вызовом std::toupper и std::tolower (и аналогичных функций).
С другой стороны, Бьярн Страуструп не упоминает об этом на языке программирования C++. Он просто использует toupper как
string name = "Niels Stroustrup";
void m3() {
string s = name.substr(6,10); // s = "Stroustr up"
name.replace(0,5,"nicholas"); // name becomes "nicholas Stroustrup"
name[0] = toupper(name[0]); // name becomes "Nicholas Stroustrup"
}
(Цитируется из упомянутой книги, 4-е издание.)
Ссылка говорит о том, что входные данные должны быть представлены как unsigned char.
Для меня это звучит так, как будто это верно для каждого char, поскольку char и unsigned char имеют одинаковый размер.
Так что этот актёрский состав ненужен или Страуструп небрежен?
Редактировать: руководство libstd C++ упоминает, что вводимый символ должен быть из базового исходного набора символов, но не приводится. Я предполагаю, что это покрыто ответом @Keith Thompson, все они имеют положительное представление как signed char и unsigned char?