除了在原始字符串文字中恢复的拼接,如果是拼接 得到一个与a的语法相匹配的字符序列 通用字符名称,行为未定义。
下面的代码段有未定义的行为(live-example):
#include <iostream>
// According to [lex.phases]1.2 this has undefined behavior
const char* p = "\\
u0041";
int main()
{
std::cout << p << '\n';
}
未定义行为的原因是什么?
答案 0 :(得分:7)
请参阅core issue 787中的讨论:
上面提到的未定义的行为 通用字符名称是考虑因素的结果 在C99理由中,第5.2.1节中描述的标题为 “UCN型号。”支持UCN的三种不同型号是 描述,每个涉及UCN和广泛之间的不同转换 字符和/或在程序翻译期间的不同时间。 实现,以及语言标准中的规范, 可以使用三者中的任何一种,但一定不可能 定义明确的程序,以确定实际使用的模型 实现。这种“等价原则”的含义是 任何可以给出不同结果的构造 不同的模型必须归类为不确定的行为。对于 例如,由线拼接产生的明显UCN将是 通过所有宽字符的实现被认可为UCN 被立即翻译成UCN,如C ++第1阶段所述, 但是不会被另一个实施所认可为UCN 所有UCN都被立即翻译成宽字符(a 在C ++阶段1)中括号内提到的可能性。