foo() below takes by-ref. Normally, rvalues cannot be passed to it:

struct S
{
    ref S memFunc()
    {
        return this;
    }
}

void foo(ref S s)
{}

void main()
{
    // As expected, fails to compile:
    // foo(S());

    // No problem: Just call a function that returns ref... :)
    foo(S().memFunc());
}

Obviously, it is the same problem for rvalues returned from functions:

    S bar()
    {
        return S();
    }

    foo(bar().memFunc());    // <-- compiles

This may be a trap especially in opAssign() because it is recommended to return by-ref unless there is a reason not to. (I wonder whether this is a reason not to. :) )

struct S
{
    ref S opAssign(S rhs)
    {
        return this;
    }
}

void foo(ref S s)
{}

void main()
{
    // As expected, fails to compile:
    // foo(S());

    // No problem; just assign... :)
    foo(S() = S());
}

Allowing assignment to rvalue feels like a bug there but I don't think we can prevent the programmer from doing S().memFunc() as in the first case.

Ali

P.S. I should have checked before writing this post. The following bugs seem related:

  http://d.puremagic.com/issues/show_bug.cgi?id=1596

  http://d.puremagic.com/issues/show_bug.cgi?id=3008

No, I haven't read them yet.

Reply via email to