我有以下结构:
struct MyStruct
{
struct Displacement
{
bool isWrapped;
int steps;
};
int initialDuration;
int currentDuration;
Displacement displacement1;
Displacement displacement2;
};
我像这样使用它:
MyStruct obj{2, 2};
auto shared = std::make_shared<MyStruct>(obj);
问题是我需要复制前两个参数,因为创建新对象时
initialDuration
和currentDuration
应该相同。因此,我创建了一个CTOR:struct MyStruct
{
struct Displacement
{
bool isWrapped;
int steps;
};
MyStruct(int duration)
: initialDuration(duration)
, currentDuration(duration)
{
}
int initialDuration;
int currentDuration;
Displacement displacement1;
Displacement displacement2;
};
然后像这样使用:
auto shared = std::make_shared<MyStruct>(2);
意外的情况1是:
Displacement
的两个MyStruct
成员均已使用垃圾初始化。对于一个bool
的true
成员,对于另一个-false
和int
是一些任意数字。因此,尽管也许我也需要为
Displacement
定义CTOR。定义如下: struct Displacement
{
Displacement() : isWrapped(false), steps(0) {}
bool isWrapped;
int steps;
};
意外的事情2是:表示其他地方
MyStruct::Displacement d {false, 0};
开始无法编译。我定义默认CTOR后,不知道aggregate initialization或list-initialization停止为POD结构工作。
请解释这两种行为的原因。
最佳答案
对于你的第一个问题
implicitly-defined default constructor在这里什么也不会做。
对于MyStruct obj{2, 2};
,obj
是一个自动对象,因此(来自标准$ 8.5 / 12初始化程序[dcl.init])
您可能希望将它们初始化为
MyStruct obj{2, 2, {false, 0}, {false, 0}};
对于第二个问题
是的,它确实可以,除非您提供另一个将std::initializer_list作为其参数的ctor。参见aggregate initialization
关于c++ - 带有垃圾的C++对象构造,为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35449320/