constexpr
подразумевает const
, но в этом случае он применяет const
к «неправильной вещи».
constexpr char*
в основном совпадает с
char * const
, который является постоянным указателем на неконстантный char
. Это не сработает, потому что строковые литералы имеют тип const char[N]
, поэтому отбрасывают константность элементов массива.
constexpr const char*
, с другой стороны, в основном совпадает с
char const * const
, который является постоянным указателем на константу char
, то есть то, что вы хотите, так как оно сохраняет константу элементов .
Вы застреваете в дополнении two, думающем - стандарт C++ не определяет представление, используемое для отрицательных чисел!
Если Ваш компьютер (бог запрещают) использует дополнение для представления отрицательных чисел, у Вас есть диапазон-127 к + 127 в 8-разрядном байте. На позитивном аспекте у Вас есть два различных возможных представления для нуля...
Однако в реальном мире, Вы вряд ли встретите компьютер поразрядного дополнения до единицы.
Неправильно думать, что неподписанный символ колеблется от 0 до 255. это - только его минимальный диапазон. символ должен иметь по крайней мере 8 битов, и символ со знаком, неподписанный символ и сам символ могут иметь действительно больше это всего 8 битов. таким образом это означает, что неподписанный символ мог пойти вне 255. хотя по общему признанию, у меня нет реализации, где она имела больше чем 8 битов, это теоретически возможно. это указано в c89 стандарте (на который C++ 03 основания), документируя файл limits.h (CHAR_BIT, UCHAR_MAX, CHAR_MAX).
Спасибо Roddy и Esteban Brenes для полезных ответов.
Это - мое текущее понимание:
Существует три возможности. Если значения будут представлены как неподписанные, то символ будет колебаться от 0 до 255. Если значения будут представлены, как вошел в систему дополнение two, символ будет колебаться от-128 до 127. Наконец, если значения будут представлены, как вошел в систему поразрядное дополнение до единицы, символ будет колебаться от-127 до 127. Эта заключительная возможность предполагает, что только было бы 255 возможных значений в отличие от 256 возможных значений для первых двух реализаций, но этому не удается принять во внимание отрицательный нуль в представлениях поразрядного дополнения до единицы.
От чтения этого кажется, что это может быть любой из тех, которые, в зависимости от реализации.
Поскольку в стандарте ничто не говорится о символьном типе, "символ" может быть:
"неподписанный символ" (0-255) на некоторых компиляторах (пример: компилятор TexasInstruments для их процессоров ARM - серия OMAP)
"символ со знаком" (-128-127) на большинстве компиляторов (gcc, MSVC...)
Для проверки у Вас всегда есть четко определенный диапазон, необходимо использовать "символ со знаком" или "неподписанный символ".