On Sun, 11 Sep 2011 18:07:41 -0700, Walter Bright wrote:
> On 9/11/2011 4:53 PM, Ali Çehreli wrote:
>> The problem is, the disabled default constructor of a *member* is
>> making a wrapper class's constructor to be disabled as well:
>
> Right. It's infectious. This is deliberate.
>
> > I think this is at least limiting and very
> likely a bug.
>
> It's deliberate. It's likely that we can find ways to loosen things up
> in the future, but the idea is to screw it down tight, first, instead of
> allowing big holes.
It is common that types insist on some data when being constructed. Many
of my C++ types cannot be default-constructed. I love the idea.
So S insists that an int must be provided during its construction. That
is great.
But although one of the major tasks of C's constructor is to initialize
its members, it cannot initialize an S member no matter how it tries.
I can see two workarounds, none of which I believe are undesirable:
1) Insist that C defines a non-default constructor but ignores the
argument with an arbitrary type:
struct S
{
@disable this();
this(int x)
{}
}
class C
{
S s;
this(int)
{
this.s = S(42); // Always 42; ignores the arg
}
}
void main()
{
auto c = new C(0); // Unused 0
}
2) Use a pointer:
class C
{
S * s; // Expensive in space
this()
{
this.s = new S(42); // Expensive in time
}
}
void main()
{
auto c = new C;
}
Ali