Intereting Posts
Crypto ++ исключение, вызывающее messageEnd Выполнение создания строки std :: C ++ из входного iteratorа Использование GLUT для простого вывода текста Расчет PTS и DTS для видео и аудио кадров Использование макроса __LINE__ в качестве параметра шаблона в visual studio Последовательности OpenCV – как создать последовательность пар точек? Функция участника вызова для каждого элемента в контейнере Размер classа с виртуальной функцией Ошибка C2059: синтаксическая ошибка «константа» Что такое # для форматирования с использованием% s Инициализация constexpr с помощью const, – int vs float Как динамически определять типы, используемые для параметризации шаблона, и сравнивать их Правильно ли сравнивать двойное с нолем, если вы предварительно инициализировали его до нуля? C ++ и, или, не, xor keywords Понимание того, какой swprintf будет использоваться (или снова, преобразовать строку char * в wchar_t *)

Что происходит с смежным конкатенацией строковых литералов, когда есть модификатор (L, u8 и т. Д.),

В 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? 

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

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

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

… Если узкий строковый литеральный токен смежна с широкоформатным символом литерала, поведение не определено. …

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

EDIT: Citation – N3242 (текущий рабочий проект C ++ 0x) §2.14.5 / 13:

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