Ale*_*der 7 c++ undefined-behavior language-lawyer c++14
根据[lex.phases] 1.2中的这句话
除了在原始字符串文字中恢复的拼接外,如果拼接导致字符序列与通用字符名称的语法匹配,则行为未定义.
下面的代码段有未定义的行为(live-example):
#include <iostream>
// According to [lex.phases]1.2 this has undefined behavior
const char* p = "\\
u0041";
int main()
{
std::cout << p << '\n';
}
Run Code Online (Sandbox Code Playgroud)
未定义行为的原因是什么?
请参阅核心问题787中的讨论:
上面提到的关于通用字符名称的未定义行为 是在C99基本原理第5.2.1节中描述的考虑因素,在标题为"UCN模型"的部分中.描述了支持UCN的三种不同模型,每种模型都是如此.涉及UCN和广泛字符之间和/或在节目翻译期间的不同时间的不同转换.实现以及语言标准中的规范可以使用三者中的任何一个,但是明确定义的程序必须不可能确定实现所使用的模型.这种"等价原则"的含义是,任何在不同模型下给出不同结果的构造都必须归类为未定义的行为.例如,线路拼接产生的明显UCN将通过一种实现被识别为UCN,其中所有宽字符被立即转换为UCN,如C++阶段1中所述,但是不会被另一个实现识别为UCN其中所有UCN都被立即翻译成宽字符(在C++阶段1中以括号内提到的可能性).
| 归档时间: |
|
| 查看次数: |
562 次 |
| 最近记录: |