I can init a variable from mutable source without defining any constructor or assignment operators, but not if the source is const. I would imagine the behavior to be the same with mutable and const source, since it's just reading the source and copying it.

Is there a reason for this? Or is this a bug?
I can workaround this by making copies or casting, that just creates ugly code everywhere.

Here's an example (with dmd 2.073):

struct Foo
{
    this( Foo source )
    {
        buf = source.buf.dup;
    }

    this( const Foo source )
    {
        buf = source.buf.dup;
    }

    this( const ref Foo source )
    {
        buf = source.buf.dup;
    }

    void opAssign( Foo source )
    {
        buf = source.buf.dup;
    }

    void opAssign( const Foo source )
    {
        buf = source.buf.dup;
    }

    void opAssign( const ref Foo source )
    {
        buf = source.buf.dup;
    }

    char[] buf;
}

Foo fun(const ref Foo foo, Foo foo2)
{
Foo bar = foo; // Error: cannot implicitly convert expression (foo) of type const(Foo) to Foo Foo baz = foo2; // Ok, No need for constructors or opAssign Foo baz2 = cast(const Foo)foo2; // Error: cannot implicitly convert expression (Foo(null).this(foo2)) of type const(Foo) to Foo
    Foo bar2;
bar2 = foo; // uses opAssing( const Foo ) / opAssign( const ref Foo )
    Foo bar3;
bar3 = foo2; // uses opAssign( const Foo ) / opAssign( Foo )
    Foo bar4;
bar4 = cast(const Foo)foo2; // uses opAssing( const Foo )

//Foo bar = Foo(foo); // This works provided there is non-const opAssign defined.
    //Foo bar = cast(Foo)foo; // This seems to work as well
    return bar;
}

Foo foo;
foo = fun(foo, foo);

Reply via email to