正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.
在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:
Run Code Online (Sandbox Code Playgroud)unsigned char x = 12; { unsigned char x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?
C++标准包含一个半着名的例子,在3.3.2中的"令人惊讶的"名称查找,"声明点":
int x = x;
Run Code Online (Sandbox Code Playgroud)
这初始化x自身,(原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量).
这实际上是未定义的行为吗?
根据4.1"左值到右值转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手是否x接受这种转换?如果是这样,示例实际上会有未定义的行为吗?
这个lambda递归有效吗?
#include <functional>
#include <iostream>
int main() {
std::function<int(int)> g = [&g](int k) {
return (k ? k * g(k-1) : 1);
};
std::cout << g(10); // 3628800
}
Run Code Online (Sandbox Code Playgroud)
它似乎编译并运行正常,但我很担心g在我初始化它的同一声明中结束.严格有效的1-10级......?
#include <iostream>
int main(int argc, char** args) {
int foo = foo + 4;
std::cout << foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
还有一个后续问题,是否有一个编译器标志来阻止这种事情?我发现-Wall有时会工作,最好是完全防止它.
My compiler:
g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
Run Code Online (Sandbox Code Playgroud) 鉴于:
int main() {
int x = 0;
int y = x; // <---
}
Run Code Online (Sandbox Code Playgroud)
可能有人请告诉我的标准(2003年首选)的这条强制要求表达的转换x,从左值到右值在对象的初始化y?
(或者,如果我错了,并且没有发生这样的转换,那么我也想学习它!)