int x = x 中左值到右值的转换和未定义行为;
C 中,是否分配未初始化值的问题其本身构成未定义行为一直是争论的话题。标准 (3.3.2) 声明用自身初始化变量(如示例 int x = x; 中所示)可能会导致意外结果。
问题的症结在于对左值的潜在要求 -此类赋值中的右值转换。假设右侧 x 是一个具有不确定值的未初始化自动变量。根据标准 (4.1),对此类值执行左值到右值转换会导致未定义的行为。
左值到右值转换的证据
尽管标准中没有明确的要求,但各种含义表明,主要目的是让内置运算符默认期望纯右值。例如,该标准指出内置赋值运算符需要对右操作数进行左值到右值的转换。其他规定还表明,除非另有明确指定,否则通常会预期左值到右值的转换。
将猜想扩展到初始化器
虽然初始化与赋值不同,该标准关于价值类别的模糊性可能会延伸到这一领域。有证据表明,预期的规范是在需要值的地方期望纯右值。
int x = x;的后果
假设猜想成立,则用以下命令初始化 x本身需要对未初始化的值进行左值到右值的转换,从而导致未定义
支持证据
进一步的证据来自于对给未初始化变量分配不同类型和不同赋值的代码的考虑。不一致的行为,例如在引用初始化时阻止左值到右值转换,但在对象初始化时允许它,增加了复制初始化中预期进行左值到右值转换的观点的可信度。
此外,缺陷报告旨在引入显式语言,在左值到右值转换过程中未定义行为的情况下,将对象值从“未初始化”重新定义为“不确定值”。这表明在 int x = x; 等情况下建立未定义行为的意图。
结论
根据所提供的证据,可以合理地得出结论:在初始化 int x = x; 时需要进行左值到右值的转换。由于右侧 x 的未初始化性质,这反过来又会导致未定义的行为。该标准的不一致和澄清的需要凸显了价值类别详细规范的重要性。
以上是`int x = x;` 是否由于左值到右值转换而导致未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!