Гарантируется ли wchar_t отличным от целочисленного типа?

В моей системе wchar_t и int являются разными типами с одинаковыми свойствами:

#include <type_traits>
sizeof(wchar_t) == sizeof(int) == 4
std::is_signed<wchar_t> == std::is_signed<int> == std::true_type
std::is_same<wchar_t, int> == std::false_type

По сравнению, ptrdiff_t а также long int одинаковые типы (одинаковые свойства, и is_same правда).

Это отличительность wchar_t гарантировано? Безопасно ли перегружать wchar_t а также int на всех системах? Есть ли какая-либо собственность в или в другом месте, которая отличает wchar_t и соответствующее свойство int, кроме is_same?

(Информация о системе: меня интересует общий случай, но мои тесты до сих пор проводились на машине с OS X под управлением g ++ 4.8.0 и Apple clang ++ 4.1, оба с -std = c ++ 11.)

5

Решение

Да, wchar_t гарантированно будет отдельный тип (§3.9.1 / 5):

Тип wchar_t это отдельный тип, значения которого могут представлять различные коды для всех членов наибольшего расширенного набора символов, указанного среди поддерживаемых локалей (22.3.1).

Так что да, это безопасно перегрузить для wchar_t а также int на всех системах.

Тем не мение, wchar_t также гарантированно предъявляются те же требования к размеру, подписи и выравниванию, что и другой интегральный тип, который является базовый тип. Это не обязательно int но в твоем случае оказывается. Это означает wchar_t Возможно, реализован с использованием одного из целочисленных типов, но, насколько вам известно, они рассматриваются как совершенно разные типы.

9

Другие решения

Да, для C ++ 11 wchar_t — это свой собственный тип, отличный от любого другого, но, как вы заметили, он также будет иметь тот же диапазон, подпись и т. Д., Что и некоторые другие типы (§3.9.1 / 3). ):

Тип wchar_t — это отдельный тип, значения которого могут представлять разные коды для всех членов самого большого расширенного набора символов, указанного среди поддерживаемых локалей (22.3.1). Тип wchar_t должен иметь те же требования к размеру, подписи и выравниванию (3.11), что и один из других интегральных типов, называемый его базовым
тип.

8

По вопросам рекламы [email protected]