如何在struct default构造后设置一个不可变成员?

时间:2015-09-12 11:50:24

标签: struct d immutability copy-constructor

我有一个结构,其中一个成员是不可变的,所以它只能在构造函数中初始化。但是因为它是一个结构体,所以可以在不调用构造函数的情况下声明实例,然后使用复制构造函数(或任何其他函数)进行初始化。

问题:编译器禁止调用,因为应该已经设置了不可变成员。

证明问题:

struct Member
{
    immutable int value;
}

struct Foo
{
    Member memb;
    this(string param)
    {
        memb = Member(1);
    }
    void reset(string name){}
}

void main(string[] args)
{
    // here error
    Foo foo;
    foo = Foo("test");

    // here memb is never set
    Foo bar; 
    bar.reset("test");
}

在现实生活中,第二种情况会发生什么。没有生成错误,但程序无法正常工作,因为未正确设置的成员未正确设置。

我可以使用一个类(因为在类中可以重写默认构造函数)但我不想这样,因为结构更少POD。

修改

重要细节:直接调用结构构造函数的参数并非全部直接可用。这在演示中没有很好地体现。

1 个答案:

答案 0 :(得分:1)

这就是@disable this();的用法 - 禁用默认构造函数,强制它在声明站点(或者在包含聚合的构造函数中)显式构造;例如,如果你的struct是类的构造函数成员)。

虽然您无法定义默认构造函数,但可以禁用它并强制用户使用其他构造函数或静态工厂方法。这样做,并让他们设置不可变成员。