Что происходит с конкатенацией литералов смежных строк при наличии модификатора (L, u8 и т. Д.) - PullRequest
11 голосов
/ 03 марта 2011

В C и C ++ допустимо разрывать строковый литерал, потому что препроцессор или компилятор объединяет смежные строковые литералы.

const char *zStr = "a" "b"; // valid

Что происходит, когда строковые литералы имеют префикс L (широкие символы), u (UTF-16), U (UTF-32), u8 (UTF-8) и необработанные строковые литералы (R"foo(this is a "raw string literal" with double quotes)foo")?

Например, является лиразрешено следующее:

const wchar_t *zStr = L"a" "b"; // valid?

Ответы [ 2 ]

12 голосов
/ 03 марта 2011

В C ++ 0x ваш пример действителен в соответствии с [lex.string] / p13:

... Если один строковый литерал не имеет префикса кодировки, он обрабатывается как строкалитерал того же префикса кодирования, что и другой операнд....

В C ++ 03 в этом же разделе сказано, что этот код имеет неопределенное поведение:

... Если узкий строковый литерал находится рядом стокен с широкой строкой, поведение не определено....

4 голосов
/ 03 марта 2011

Да, этот конкретный пример разрешен C ++ 0x.Любая комбинация литералов без префиксов и с префиксом L будет обрабатываться так, как если бы все литералы были с префиксом L.

РЕДАКТИРОВАТЬ: Цитирование - N3242 (текущий рабочий проект C ++ 0x) §2.14.5 / 13:

На этапе перевода 6 (2.2) смежные строковые литералы объединяются.Если оба строковых литерала имеют одинаковый префикс кодировки, результирующий составной строковый литерал имеет этот префикс кодировки.Если один строковый литерал не имеет префикса кодировки, он обрабатывается как строковый литерал с тем же префиксом кодировки, что и другой операнд.

...