Это просто ошибка. §2.1 / 1 говорит о Фазе 1,
(Реализация может использовать любую внутреннюю кодировку, если только фактический расширенный символ встречается в исходном файле, и тот же расширенный символ, выраженный в исходном файле, что и имя универсального символа (т. Е. С использованием нотации \ uXXXX) , обрабатываются одинаково.)
Это не примечание или сноска. C ++ 0x добавляет исключение для необработанных строковых литералов, которые могут решить вашу проблему под рукой, если у вас есть такой.
Эта программа наглядно демонстрирует неисправность:
#include <iostream>
#define GET_UCN(X) L ## #X
int main() {
std::wcout << GET_UCN("€") << '\n' << GET_UCN("\u20AC") << '\n';
}
http://ideone.com/lb9jc
Поскольку обе строки широкие, первую необходимо разбить на несколько символов, если компилятор не сможет интерпретировать входную многобайтовую последовательность. В приведенном вами примере полное отсутствие поддержки UTF-8 может привести к тому, что компилятор будет рабски повторять последовательность сразу.