On 4/24/17 2:48 PM, Stanislav Blinov wrote:
On Monday, 24 April 2017 at 15:19:29 UTC, Manu wrote:

If you're going to pinch the guts of rvalue arguments, then this needs to
be 100% reliable.
This needs to be aggressively unit-tested, and probably documented that
this is the official pattern for rvalue construction/assignment
operations.

Looking over your OP again, and the report made by Petar Kirov, I
realized this is not quite right. We can't, generally speaking, treat
this(const ref X x) as a copy ctor.

Consider:

struct X
{
    int* ptr;
}

struct Y
{
    int* ptr;

    this(ref const X x)
    {
        // ptr == ???;
        // typeof(x.ptr) == const(int*)
        // seems like the only way to implement this is:
        // ptr = new int(*x.ptr);
    }

    this(X x)
    {
        import std.algorithm.mutation : swap;
        swap(ptr, x.ptr);
    }
}

X x;
Y y = x; // this(ref const X) is called

Suddenly, we can't copy the pointer, or at least make a shallow copy of
it, without violating const, and the latter is UB.

This is what inout is for. I'll update the bug report.

-Steve

Reply via email to