我正在玩C++ 值初始化。
因此,我正在打印未初始化的值,以便根据 C++ 标准版本突出显示(取消)初始化。
但是未初始化的值通常传达零值:-(
如果变量尚未初始化,如何突出显示?
(即,如何告诉编译器为未初始化的变量使用特定值?)
也许这可以使用神奇的用户提供的分配器来完成......
编辑:我下面的片段不适用于生产。我只是想检查 C++ 标准的实现(由编译器)关于 uninitialization/value-initialization/zero-initialization/default-initialization 机制。我不想要关于未初始化变量的编译器警告。我不想使用 MemoryCheckers。我只想强调编译器零初始化一些变量,默认初始化一些其他变量并且不对所有其他变量进行初始化。而且这种初始化行为还取决于 C++ 标准的版本。如果您认为最好的方法是使用编译器警告或 MemoryCheckers,请使用以下代码段提供答案。
如果您已经理解了我的问题,请不要阅读下面的详细尝试。
#include <iostream>
struct A {
A() {} // user-defined default ctor does not initialize i
int i;
};
struct B {
A a;
};
int main()
{
std::cout << B().a.i << '\n';
// Results: C++03 -> uninitialized
// C++11 -> zero-initialized
std::cout << B{}.a.i << '\n';
// Results: C++03 -> Do not compile - B{} is correct since C++11
// C++11 -> uninitialized because
// DR1301 defines B{} as an aggregate-initialization
} // => A is value-initialized using the user-defined ctor
使用-std=c++03
执行编译时可能会打印零值,但我更喜欢非零值。
0
可能的输出使用-std=c++11
0
1208617840
另一个可能的输出使用-std=c++11
0
-201855824
但是我更高级的代码片段现在对于未初始化的对象具有零值B{}.a.i
:-(
#include <iostream>
struct A {
A() {} // user-defined ctor does not initialize i
int i;
};
struct B {
A a;
};
int main()
{
std::cout <<"-----------"<< __cplusplus <<"-----------" "\n";
std::cout <<"B().a.i = "<< B().a.i <<'\n';
std::cout <<"B{}.a.i = "<< B{}.a.i <<'\n';
int d;
d = 42;
std::cout <<"(new(&d) B )->a.i = "<< (new(&d) B )->a.i <<'\n';
d = 42;
std::cout <<"(new(&d) B())->a.i = "<< (new(&d) B())->a.i <<'\n';
d = 42;
std::cout <<"(new(&d) B{})->a.i = "<< (new(&d) B{})->a.i <<'\n';
}
构建/运行输出:
> g++ -std=c++03 -Wall -Wextra -pedantic main.cpp && ./a.out
-----------199711-----------
B().a.i = 0
(new(&d) B )->a.i = 42
(new(&d) B())->a.i = 0
> g++ -std=c++11 -Wall -Wextra -pedantic main.cpp && ./a.out
-----------201103-----------
B().a.i = 0
B{}.a.i = 0
(new(&d) B )->a.i = 42
(new(&d) B())->a.i = 0
(new(&d) B{})->a.i = 0
> g++ -std=c++14 -Wall -Wextra -pedantic main.cpp && ./a.out
-----------201402-----------
B().a.i = 0
B{}.a.i = 0
(new(&d) B )->a.i = 42
(new(&d) B())->a.i = 0
(new(&d) B{})->a.i = 0