Thread overview
Initialise non-copyable, non-default-constrauctable member struct
Jul 27, 2018
Peter Particle
Jul 27, 2018
aliak
Jul 27, 2018
aliak
Jul 27, 2018
Peter Particle
July 27, 2018
Question is related to this:
https://dlang.org/spec/struct.html#disable_default_construction

struct S {
    int x;
    @disable this();     // Disables default construction
    @disable this(this); // Disable copying

    this(int v) { x = v; }
}

struct T {
    float y;
    S s;
    @disable this();     // Disables default construction
    @disable this(this); // Disable copying

    this(float v) {
        y = v;

        s = S(cast(int)v);    // tried option 1
        s.__ctor(cast(int)v); // tried option 2

    }
}

Error: struct `S` is not copyable because it is annotated with `@disable`
in both cases.

Is there some way around this problem?
July 27, 2018
On Friday, 27 July 2018 at 12:11:37 UTC, Peter Particle wrote:
> Question is related to this:
> https://dlang.org/spec/struct.html#disable_default_construction
>
> struct S {
>     int x;
>     @disable this();     // Disables default construction
>     @disable this(this); // Disable copying
>
>     this(int v) { x = v; }
> }
>
> struct T {
>     float y;
>     S s;
>     @disable this();     // Disables default construction
>     @disable this(this); // Disable copying
>
>     this(float v) {
>         y = v;
>
>         s = S(cast(int)v);    // tried option 1
>         s.__ctor(cast(int)v); // tried option 2
>
>     }
> }
>
> Error: struct `S` is not copyable because it is annotated with `@disable`
> in both cases.
>
> Is there some way around this problem?

This works on the latest dmd:

struct S {
    int x;
    @disable this();     // Disables default construction
    @disable this(this); // Disable copying

    this(int v) { x = v; }
}

struct T {
    float y;
    S s;
    @disable this();     // Disables default construction
    @disable this(this); // Disable copying

    this(float v) {
        y = v;
        s = S(cast(int)v);
    }
}

void main() {
    auto s = T(3);
}

https://run.dlang.io/is/lLrUiq
July 27, 2018
On Friday, 27 July 2018 at 13:05:07 UTC, aliak wrote:
> https://run.dlang.io/is/lLrUiq

Sorry: https://run.dlang.io/is/20FUoj

July 27, 2018
On Friday, 27 July 2018 at 13:06:10 UTC, aliak wrote:
> On Friday, 27 July 2018 at 13:05:07 UTC, aliak wrote:
>> https://run.dlang.io/is/lLrUiq
>
> Sorry: https://run.dlang.io/is/20FUoj

Thanks, you are right, but it seems that I have reduced my issue too much, as it still does not work with my actual case. I will try to properly reduce my code to present my issue. I think that the simple example can be fully figured out statically, but my case not.