这段代码,为什么它必须显示未定义的行为?

时间:2017-05-06 19:47:51

标签: c++ c++14 language-lawyer undefined-behavior

根据[lex.phases]1.2

中的这句话
  

除了在原始字符串文字中恢复的拼接,如果是拼接   得到一个与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';
}

未定义行为的原因是什么?

1 个答案:

答案 0 :(得分:7)

请参阅core issue 787中的讨论:

  

上面提到的未定义的行为   通用字符名称是考虑因素的结果   在C99理由中,第5.2.1节中描述的标题为   “UCN型号。”支持UCN的三种不同型号是   描述,每个涉及UCN和广泛之间的不同转换   字符和/或在程序翻译期间的不同时间。   实现,以及语言标准中的规范,   可以使用三者中的任何一种,但一定不可能   定义明确的程序,以确定实际使用的模型   实现。这种“等价原则”的含义是   任何可以给出不同结果的构造   不同的模型必须归类为不确定的行为。对于   例如,由线拼接产生的明显UCN将是   通过所有宽字符的实现被认可为UCN   被立即翻译成UCN,如C ++第1阶段所述,   但是不会被另一个实施所认可为UCN   所有UCN都被立即翻译成宽字符(a   在C ++阶段1)中括号内提到的可能性。