В моей системе 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.)
Да, wchar_t
гарантированно будет отдельный тип (§3.9.1 / 5):
Тип
wchar_t
это отдельный тип, значения которого могут представлять различные коды для всех членов наибольшего расширенного набора символов, указанного среди поддерживаемых локалей (22.3.1).
Так что да, это безопасно перегрузить для wchar_t
а также int
на всех системах.
Тем не мение, wchar_t
также гарантированно предъявляются те же требования к размеру, подписи и выравниванию, что и другой интегральный тип, который является базовый тип. Это не обязательно int
но в твоем случае оказывается. Это означает wchar_t
Возможно, реализован с использованием одного из целочисленных типов, но, насколько вам известно, они рассматриваются как совершенно разные типы.
Да, для C ++ 11 wchar_t — это свой собственный тип, отличный от любого другого, но, как вы заметили, он также будет иметь тот же диапазон, подпись и т. Д., Что и некоторые другие типы (§3.9.1 / 3). ):
Тип wchar_t — это отдельный тип, значения которого могут представлять разные коды для всех членов самого большого расширенного набора символов, указанного среди поддерживаемых локалей (22.3.1). Тип wchar_t должен иметь те же требования к размеру, подписи и выравниванию (3.11), что и один из других интегральных типов, называемый его базовым
тип.