Давайте рассмотрим следующую цитату из стандарта C ++ 11 (проект N3376, точнее):
(2.14.8.5)
Если L — определяемый пользователем строковый литерал, пусть str будет литералом без
его ud-su ffi x и пусть len будет количеством кодовых единиц в str (то есть его
длина, исключая завершающий нулевой символ). Буква L является
рассматривается как вызов формыoperator "" X (str , len )
Принимая во внимание, что для всех других типов пользовательских литералов (с плавающей точкой, целое число, символ) длина никогда не передается, даже если сам литерал передается как строка. Например:
42_zzz; // calls operator "" _zzz("42") and not operator "" _zzz("42", 2)
Почему существует такое различие между строковыми и нестроковыми пользовательскими литералами? Или я должен сказать, почему реализация передает len для строковых литералов UD? Длина, как и в случае других литералов, может быть выведена путем нулевого завершения. Что мне не хватает?
Для строкового литерала разумно предположить, что нулевой символ вставлен в последовательность строки, например, "a\0b"
, Чтобы реализация могла использовать весь строковый литерал, даже если есть встроенный нулевой символ, ей нужно знать длину литерала. Другие формы для пользовательских литералов не могут содержать встроенные нулевые символы.
Строки всегда оканчиваются нулем в C / C ++, но это никогда не означает, что они не могут содержать встроенные \0
характер, вы можете иметь "1234\05678"
и хотя эта строка завершается нулем, в ней содержится дополнительный ‘\ 0`.