Почему это разрешено:
uint32_t x = 'name';
Но это усекается до 32 бит:
uint64_t x = 'namename';
Есть ли способ иметь 8-байтовый многосимвольный литерал?
Почему это разрешено:
uint32_t x = 'name';
Но это усекается до 32 бит:
uint64_t x = 'namename';
Есть ли способ иметь 8-байтовый многосимвольный литерал?
Да, если ваш компилятор поддерживает 8-байтовые int
s.
Стандарт C++ довольно лаконичен в отношении многосимвольных литералов. Это все, что он может сказать по этому поводу (С++ 14, 2.14.3/1):
Обычный символьный литерал, содержащий более одного c-char, является многосимвольным литералом. Многосимвольный литерал или обычный символьный литерал, содержащий один c-char< /em> не может быть представлен в наборе символов выполнения, поддерживается условно, имеет тип
int
и имеет значение, определяемое реализацией.
(выделено мной)
Как видите, почти все, что говорит стандарт, это то, что если многосимвольные литералы поддерживаются (это не обязательно), они имеют тип int
. Значение зависит от компилятора.
'name'
не является строковым литералом.
- person Keith Thompson; 30.09.2015
Если поддерживаются только 4-байтовые многосимвольные буквы, вы можете использовать:
uint64_t x = (((uint64_t)'abcd') << 32) + 'efgh';
но это, вероятно, закончится как 2 литерала.
'name'
- это не строковый литерал, это символьный литерал, в частности многосимвольный литерал. Он имеет типint
и имеет значение, определяемое реализацией. Это не особенно полезная функция языка. - person Keith Thompson   schedule 30.09.2015