Ответ 1
Прежде всего, важно подчеркнуть тот факт, что char
, signed char
и unsigned char
- все разные типы. Раздел 4.10 стандарта С++ 11 определяет три возможных стандартных преобразования указателей между указателями разных типов:
1. Константа нулевого указателя представляет собой целочисленное константное выражение (5.19) prvalue целочисленного типа, которое вычисляет нуль или значение prtyue типа std:: nullptr_t. Константа нулевого указателя может быть преобразована в тип указателя; результатом является нулевое значение указателя этого типа и отличается от любого другого значения указателя объекта или типа указателя функции. Такое преобразование называется преобразованием нулевого указателя. Два значения нулевого указателя того же типа сравниваются равными. Преобразование константы с нулевым указателем в указатель на тип с квалификацией cv - это одно преобразование, а не последовательность преобразования указателя с последующим квалификационным преобразованием (4.4). Константу нулевого указателя интегрального типа можно преобразовать в prvalue типа std:: nullptr_t. [Примечание: полученное значение prvalue не является нулевым значением указателя. -end note]
Это не актуально, так как здесь нет указателей на нуль типа nulltptr_t
.
2. Prvalue типа "указатель на cv T", где T - тип объекта, может быть преобразован в prvalue типа "указатель на cv void". Результат преобразования "указателя на cv T" в "указатель на cv void" указывает на начало места хранения, где находится объект типа T, как если бы объект был наиболее производным объектом (1.8) типа T (то есть не подобъектом базового класса). Значение нулевого указателя преобразуется в значение нулевого указателя тип назначения.
Это не может применяться, поскольку тип назначения не void
. Наконец,
3. Prvalue типа "указатель на cv D", где D - тип класса, может быть преобразован в prvalue типа "указатель на cv B", где B является базовым классом (п .10) D. Если B является недоступным (п. 11) или двусмысленным (10.2) базовым классом D, программа, которая требует этого преобразования, плохо сформирована. Результатом преобразования является указатель на подобъект базового класса объекта производного класса. Значение нулевого указателя преобразуется в значение нулевого указателя для типа адресата.
signed char
не является базовым классом char
, поэтому даже это не относится.
Следовательно, неявное стандартное преобразование указателя от signed char
до char
не может быть выполнено.
С другой стороны, конверсии между значениями интегральных типов разрешены в соответствии с тем, что указано в пункте 4.7.