【发布时间】:2017-07-28 06:27:33
【问题描述】:
以普通结构(或类)和普通旧数据类型和对象作为成员。请注意,没有定义默认构造函数。
struct Foo
{
int x;
int y;
double z;
string str;
};
现在,如果我在堆栈上声明一个实例 f 并尝试打印其内容:
{
Foo f;
std::cout << f.x << " " << f.y << " " << f.z << f.str << std::endl;
}
结果是为 x、y 和 z 打印的垃圾数据。并且字符串默认初始化为空。 正如预期的那样。
如果我使用make_shared 创建shared_ptr<Foo> 的实例并打印:
{
shared_ptr<Foo> spFoo = make_shared<Foo>();
cout << spFoo->x << " " << spFoo->y << " " << spFoo->z << spFoo->str << endl;
}
那么,x、y 和 z 都是0。这使得shared_ptr 在构造对象实例后对每个成员执行默认初始化(零初始化)。至少这是我在 Visual Studio 的编译器中观察到的。
这是 C++ 的标准吗?或者是否有必要在实例化之后有一个显式的构造函数或显式的={} 语句来保证所有编译器的零初始化行为?
【问题讨论】:
-
实际问题:您想要一个保证,让您可以依赖这个,还是一个避免它的方法?
-
前者。我想确保它是标准行为,以便可以在不同的编译器中依赖它。
标签: c++ c++11 initialization shared-ptr