我有以下结构:

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);

问题是我需要复制前两个参数,因为创建新对象时initialDurationcurrentDuration应该相同。因此,我创建了一个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成员均已使用垃圾初始化。对于一个booltrue成员,对于另一个-falseint是一些任意数字。

因此,尽管也许我也需要为Displacement定义CTOR。定义如下:
    struct Displacement
    {
        Displacement() : isWrapped(false), steps(0) {}

        bool            isWrapped;
        int             steps;
    };

意外的事情2是:表示其他地方
  MyStruct::Displacement d {false, 0};

开始无法编译。我定义默认CTOR后,不知道aggregate initializationlist-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/

10-13 03:00