Вероятно, дефект в формулировке рабочего проекта C++ (правила ранжирования целочисленного преобразования)

Я обнаружил возможное противоречие в рабочем проекте стандарта 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.

Является ли это фактическим противоречием, или я неправильно понимаю, когда два тривиально копируемых типа являются разными типами в С++?


person pablo1977    schedule 02.03.2021    source источник


Ответы (1)


у нас есть два разных целочисленных типа со знаком

Я нигде не вижу в стандарте, что wchar_t является целым числом со знаком. Или целочисленный тип без знака. Я вижу, где здесь написано, что это целочисленный тип:

Типы bool, char, wchar_t, char8_t, char16_t, char32_t, а также целочисленные типы со знаком и без знака вместе называются интегральными типами. Синонимом целочисленного типа является целочисленный тип.

Но определение целочисленного типа со знаком не включает wchar_t. То есть стандарт явно допускает существование целочисленных типов, которые не являются ни целочисленными типами со знаком, ни целочисленными типами без знака.

И утверждение из [усл.ранг] к таким типам не относится.

person Nicol Bolas    schedule 02.03.2021
comment
О, я понимаю вашу точку зрения. Спасибо. - person pablo1977; 02.03.2021
comment
Хм... Возможно, это все еще проблематично. Стандарт не присваивает (не-)подписанность ни одному из этих типов — хотя технически просто невозможно, чтобы они были ни подписанными, ни неподписанными. Есть ли у нас два разных определения «(не)знаковости»? - person Aconcagua; 02.03.2021
comment
@Aconcagua Меня убедил Никол Болас, поскольку кажется, что целочисленные типы со знаком и целочисленные типы без знака являются простыми именами определенных классов целочисленных типов. Базовым типом char8_t является unsigned char, но классификация char8_t - это не целочисленный тип без знака, а просто другой целочисленный тип. - person pablo1977; 02.03.2021
comment
@Aconcagua: просто невозможно, чтобы они были ни подписанными, ни неподписанными Почему бы и нет? Если вы забудете английский язык и просто возьмете термины, определенные стандартом, то у вас останется что-то вроде этого: типы A, B, C — это X-типы, типы D, E, F — Y-типы, а типы Q, R и все типы X&Y являются типами Z. Независимо от того, какие слова используются для X, Y и Z, если стандарт не определяет отношение между ними, то отношения нет. - person Nicol Bolas; 02.03.2021
comment
Я рассматривал возможность реализации на конкретных системах. По крайней мере, на тех, которые у нас есть сегодня, любой такой тип будет либо подписанным, либо беззнаковым. На самом деле, я уже был удовлетворен комментарием @ pablo1977 (см. его пример char8_t) ;) - person Aconcagua; 02.03.2021
comment
@Aconcagua 1)char 2)unsigned char 3)signed char все могут быть определены как разные типы. Так что на самом деле я рассматриваю это как третий тип: без подписи. - person Robert Andrzejuk; 02.03.2021
comment
@RobertAndrzejuk char всегда определяется как другой тип unsignec char и signed char. Однако char всегда ведет себя так же, как unsigned char или скважина signed char. Все целочисленные типы (кроме bool) ведут себя так же, как некоторые базовые целочисленные типы без знака или со знаком. Однако классифицировать его как целочисленный тип со знаком или без знака или просто исключить его — это всего лишь вопрос классификации. - person pablo1977; 02.03.2021
comment
@ pablo1977 Так что лучшим названием для него было бы anon-signdness :-p - person Robert Andrzejuk; 02.03.2021
comment
@RobertAndrzejuk Я согласен. Возможно, формулировка в стандартах не самая лучшая. - person pablo1977; 02.03.2021