为了账号安全,请及时绑定邮箱和手机立即绑定

C+标准是否在C+14中使用不定值和未定义行为方面发生了变化?

C+标准是否在C+14中使用不定值和未定义行为方面发生了变化?

C++ C
慕雪6442864 2019-06-06 10:39:04
C+标准是否在C+14中使用不定值和未定义行为方面发生了变化?包括在初始化是否需要从lvalue到rvalue的转换?是int x = x;UB?C+标准中有一个令人惊讶的例子3.3.2 申报点其中一个int是用它自己的不定值初始化的:int x = 12;{ int x = x; }这里,第二个x是用它自己的(不确定的)值初始化的。-终例 ]约翰斯对这个问题的回答表明,这是一个未定义的行为,因为它需要从lvalue到rvalue的转换。在最新的C+14标准草案中N3936可以找到这里此示例已更改为:unsigned char x = 12;{ unsigned char x = x; }这里,第二个x是用它自己的(不确定的)值初始化的。-终例 ]在这个例子中,C+14中的不确定值和未定义行为是否发生了改变?
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

是的,这一变化是由语言中的变化驱动的,这些变化使其行为不明确。如果不确定值是由计算生成的。但除了一些例外无符号窄字符.

缺陷报告1787其建议的文本可在N 39141曾.最近于2014年接受并被纳入最新的工作草案。N3936:

与不确定值相关的最有趣的更改将是对节的更改。8.5段落12这包括:

如果没有为对象指定初始化程序,则该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储持续时间的对象的值不确定。[注:具有静态或线程存储持续时间的对象为零初始化对象,请参见3.6.2。-尾注 ]

到(重点雷):

如果没有为对象指定初始化程序,则该对象是默认初始化的。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不定值,如果不对象执行初始化,则该对象保留一个不确定值,直到替换该值(5.17[expr.ass])。[注意:具有静态或线程存储持续时间的对象为零初始化,请参见3.6.2[basic.start.init]。-尾注]如果由求值产生不确定值,则除下列情况外,该行为是未定义的。:

  • 如果一个无符号窄字符类型(3.9.1[basic.basic])的不确定值是通过对以下方面的评估而产生的:

    然后,操作的结果是一个不确定的值。

    • 条件表达式的第二个或第三个操作数(5.16[expr.cond]),

    • 逗号的右操作数(5.18[除逗号]),

    • 转换或转换为无符号窄字符类型的操作数(4.7[等号整],5.2.3[expr.type.conv],5.2.9[expr.static.cast],5.4[expr.cast],或

    • 被丢弃的值表达式(第5[expr]条),

  • 如果一个无符号窄字符类型的不确定值(3.9.1[basic.basic])是由一个简单赋值运算符(5.17[expr.ass])的右操作数计算产生的,其第一个操作数是无符号窄字符类型的lvalue,则一个不确定值替换左操作数所引用的对象的值。

  • 如果在初始化无符号窄字符类型的对象时,通过初始化表达式的计算生成无符号窄字符类型的不确定值(3.9.1[basic.basic]),则该对象被初始化为不确定的值。

并包括以下示例:

例子:

int f(bool b) {
  unsigned char c;
  unsigned char d = c; // OK, d has an indeterminate value
  int e = d;           // undefined behavior
  return b ? d : 0;    // undefined behavior if b is true}

— 终例 ]

我们可以在N 3936哪个是当前工作草案N3937C++14 DIS.

C+1Y之前

有趣的是,在此草案之前,与C不同的是它一直有一个明确的概念,不确定值的用途是未定义的。C+使用了不定值一词,甚至没有定义它(假设我们不能借用C99的定义)以及见缺陷报告616..我们不得不依靠未指定的lvalue-rvalue转换C+11标准草案包括在部分4.1 lvalue-rvalue转换段落1上面写着:

[.]如果对象未初始化,则需要进行此转换的程序具有未定义的行为。[.]


脚注:

  1. 1787

    是对

    缺陷报告616

    ,我们可以在

    N 3903


查看完整回答
反对 回复 2019-06-06
  • 1 回答
  • 0 关注
  • 338 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信