在C++中,以下短语意味着什么:
C++开发人员应该知道些什么呢?
发布于 2009-10-23 13:48:46
需要认识到的一件事是,“值-初始化”是C++ 2003标准中的新内容--它在1998年的标准中并不存在(我认为这可能是唯一的区别,而不仅仅是澄清)。直接从标准中获得定义,请参见Kirill V. Lyadvinsky's answer。
请参阅关于operator new行为的前面这个答案,了解这些类型初始化的不同行为以及它们何时启动(以及它们与c++98和C++03的不同之处):
答案的要点是:
有时新操作符返回的内存将被初始化,有时它将不取决于您要更新的类型是POD,或者它是否是包含POD成员的类,并且使用编译器生成的默认构造函数。
至少他们说,这是相当复杂的,当不同的方法开始的时候是微妙的。
当然要注意的是,MSVC遵循C++98规则,甚至在VS 2008 (VC 9或cl.exe版本15.x)中也是如此。
下面的片段显示MSVC和Digital遵循C++98规则,GCC 3.4.5和Comeau遵循C++03规则:
#include <cstdio>
#include <cstring>
#include <new>
struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m
int main()
{
char buf[sizeof(B)];
std::memset( buf, 0x5a, sizeof( buf));
// use placement new on the memset'ed buffer to make sure
// if we see a zero result it's due to an explicit
// value initialization
B* pB = new(buf) B(); //C++98 rules - pB->m is uninitialized
//C++03 rules - pB->m is set to 0
std::printf( "m is %d\n", pB->m);
return 0;
}发布于 2009-10-23 13:20:55
C++03标准8.5/5:
zero-initialize类型为T的对象的
表示:
-如果T是标量类型(3.9),则将对象设置为转换为T的0(0)值;
-如果T是非并类类型,则每个非静态数据成员和每个基类子对象都为零初始化;
-如果T是一个联合类型,则对象的第一个命名数据成员为零初始化;
-如果T是数组类型,则每个元素都为零初始化;
-如果T是引用类型,则不执行初始化。要default-initialize,T类型的对象意味着:
-如果T是非POD类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化不正确);
-如果T是数组类型,则每个元素都是默认初始化的;
-否则,对象将为零初始化。
要value-initialize,T类型的对象意味着:
-如果T是具有用户声明的构造函数(12.1)的类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
-如果T是一个没有用户声明的构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都是值初始化的;
-如果T是数组类型,则每个元素都是值初始化的;
-否则,对象将为零初始化。
调用引用类型实体的默认初始化或值初始化的程序格式不正确.如果T是cv限定类型,则使用cv不限定的T版本来定义零初始化、默认初始化和值初始化.
https://stackoverflow.com/questions/1613341
复制相似问题