我有一个结构,其中一个成员是不可变的,所以它只能在构造函数中初始化。但是因为它是一个结构体,所以可以在不调用构造函数的情况下声明实例,然后使用复制构造函数(或任何其他函数)进行初始化。
问题:编译器禁止调用,因为应该已经设置了不可变成员。
证明问题:
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。
修改
重要细节:直接调用结构构造函数的参数并非全部直接可用。这在演示中没有很好地体现。
答案 0 :(得分:1)
这就是@disable this();
的用法 - 禁用默认构造函数,强制它在声明站点(或者在包含聚合的构造函数中)显式构造;例如,如果你的struct是类的构造函数成员)。
虽然您无法定义默认构造函数,但可以禁用它并强制用户使用其他构造函数或静态工厂方法。这样做,并让他们设置不可变成员。