почему я не могу передать беззнаковый символ a = 'g' и подписанный символ b = 'g' в пустоту f (char &) {}
Потому что unsigned char
, signed char
и char
являются различными типами. И потому что ссылка не может быть связана с объектом неправильного типа. Даже со знаком или без знака целочисленного типа с одинаковой шириной (символьные типы являются целочисленными). Это ограничение является аспектом строгой типизации в языке и не позволяет программистам совершать ошибки, передавая объекты неправильного типа по ошибке.
Тем не менее, варианты без знака / со знаком могут быть неявно преобразованы друг в друга. Но результатом преобразования является rvalue, и неконстантная ссылка на lvalue не может быть привязана к rvalue. Ссылка const lvalue может быть связана с rvalue. В этом случае время жизни временного результата преобразования увеличивается, чтобы соответствовать времени жизни ссылки.
знаковый символ в символ, если они имеют одинаковый диапазон значений
signed char
и char
не обязательно имеют одинаковый диапазон значений во всех системах. В отличие от других целочисленных типов, где int
соответствует типу signed int
, char
отличается от signed char
и unsigned char
и может быть подписанным или неподписанным в зависимости от системы.
но я могу передать ему char c = 'g'?
Это потому, что ссылка на тип T
может быть связана с объектом типа T
.