Объединение несовпадающих строк РАБОТАЕТ в VC2015 — как?

Когда у нас есть что-то из этого:

auto city1 = "New "  L"Delhi";
auto city2 = L"New " "York";

Любой компилятор до VS2015 вызовет ошибку:

ошибка C2308: объединение несовпадающих строк

Но с компилятором VC2015 он хорошо компилируется, и результирующий тип (вывод auto) представляет собой строку с широкими символами.

Мой вопрос: когда и как это стало возможным - любая стандартная спецификация?


person Ajay    schedule 04.08.2015    source источник
comment
Это может помочь: en.cppreference.com/w/cpp/language/string_literal   -  person Mithrandir    schedule 04.08.2015


Ответы (1)


В C++03 это поведение было бы неопределенным.

ISO 14882-2003: 2.13.4.3 утверждает, что

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

Точно не известно, когда было введено изменение, но поведение, по крайней мере, хорошо определено в проекте стандарта N3242.

ISO 14882-2011: 2.14.5.13 утверждает, что

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

Следовательно, в вашем случае auto правильно выводится как широкий строковый литерал.

person ctor    schedule 04.08.2015