Я обнаружил возможное противоречие в рабочем проекте стандарта C++. Сначала я излагаю факты, а в конце — мой вопрос.
Когда установлены целочисленные рейтинги конверсии, [conv.rank]/1.1 говорит
Никакие два целочисленных типа со знаком [...] не должны иметь один и тот же целочисленный ранг преобразования, даже если они имеют одинаковое представление.
[basic.fundamental]/8 говорит:
Тип
wchar_t
— это отдельный тип, который имеет определяемый реализацией целочисленный тип со знаком или без знака в качестве базового типа.
Наконец, [conv.rank]/1.8:
Ранги
char8_t
,char16_t
,char32_t
иwchar_t
должны быть равны рангам их базовых типов ([basic.fundamental]).
В случае, если wchar_t
будет реализован как целочисленный тип со знаком, он будет иметь тот же ранг, что и его базовый тип, который является отличным типом какого-либо другого целочисленного типа.
Таким образом, у нас есть два разных целочисленных типа со знаком с одинаковым рангом, что противоречит [conv.rank]/1.1.
Является ли это фактическим противоречием, или я неправильно понимаю, когда два тривиально копируемых типа являются разными типами в С++?