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