Does initialization entail lvalue-to-rvalue conversion? Is int x = x; UB?所述,C++标准在3.3.2部分的声明点中有一个令人惊讶的示例,其中int用其自己的不确定值初始化:



Johannes对此问题的回答表明是未定义的行为,因为它需要从左值到右值的转换。

在最新的C++ 14草案标准N3936(可以找到here中)中,此示例已更改为:



在C++ 14中,关于不确定值和未定义行为的某些变化导致了示例中的这种变化吗?

最佳答案

是的,这种变化是由语言的变化所驱动的,如果通过求值产生不确定的值,则该行为将导致不确定的行为,但对于无符号的窄字符则有一些异常(exception)。

Defect report 1787的建议文本可以在N3914 1中找到,它是recently accepted in 2014,并已纳入最新的工作草案N3936中:

关于不确定值的最有趣的更改将是8.5第12段,该段来自:



到(强调我的):



并包含以下示例:



我们可以在N3936中找到此文本,它是当前的working draft,而N3937C++14 DIS

在C++ 1y之前

有趣的是,在此草案之前,与C which has always had a well specified notion of what uses of indeterminate values were undefined不同,C++使用了不确定值一词,甚至没有定义它(assuming we can not borrow definition from C99)和see defect report 616。我们必须依靠underspecified lvalue-to-rvalue conversion,在4.1左值到右值转换第1段中介绍了draft C++11 standard中的内容:



脚注:

  • 1787defect report 616的修订版,我们可以在N3903中找到该信息
  • 关于c++ - 在C++ 14中使用不确定值和未定义行为方面,C++标准是否已更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23415661/

    10-09 16:40