Разрешает ли С++ многосимвольные литералы длиной 8 байт?

Почему это разрешено:

uint32_t x = 'name';

Но это усекается до 32 бит:

uint64_t x = 'namename';

Есть ли способ иметь 8-байтовый многосимвольный литерал?


person Charles W    schedule 30.09.2015    source источник
comment
Я не узнаю такой синтаксис. как вы могли скомпилировать строку с символьным синтаксисом?   -  person David Haim    schedule 30.09.2015
comment
Он компилируется правильно, но я не вижу варианта использования этого кода!   -  person rkachach    schedule 30.09.2015
comment
@DavidHaim: 'name' - это не строковый литерал, это символьный литерал, в частности многосимвольный литерал. Он имеет тип int и имеет значение, определяемое реализацией. Это не особенно полезная функция языка.   -  person Keith Thompson    schedule 30.09.2015


Ответы (2)


Да, если ваш компилятор поддерживает 8-байтовые ints.

Стандарт C++ довольно лаконичен в отношении многосимвольных литералов. Это все, что он может сказать по этому поводу (С++ 14, 2.14.3/1):

Обычный символьный литерал, содержащий более одного c-char, является многосимвольным литералом. Многосимвольный литерал или обычный символьный литерал, содержащий один c-char< /em> не может быть представлен в наборе символов выполнения, поддерживается условно, имеет тип int и имеет значение, определяемое реализацией.

(выделено мной)

Как видите, почти все, что говорит стандарт, это то, что если многосимвольные литералы поддерживаются (это не обязательно), они имеют тип int. Значение зависит от компилятора.

person Angew is no longer proud of SO    schedule 30.09.2015
comment
Итак, краткий ответ заключается в том, что это работает именно так, потому что на его платформе int составляет 32 бита. - person David Schwartz; 30.09.2015
comment
Почему нужно инициализировать целое число строковым литералом? не могли бы вы привести несколько примеров? - person rkachach; 30.09.2015
comment
@redobot: строковые литералы нельзя использовать в качестве аргументов шаблона, многосимвольные литералы можно использовать в качестве аргументов шаблона коротких строк (не то, чтобы я рекомендовал это помимо игрушек) - person peterchen; 30.09.2015
comment
@redobot: 'name' не является строковым литералом. - person Keith Thompson; 30.09.2015

Если поддерживаются только 4-байтовые многосимвольные буквы, вы можете использовать:

uint64_t x = (((uint64_t)'abcd') << 32) + 'efgh';

но это, вероятно, закончится как 2 литерала.

person rcgldr    schedule 30.09.2015