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