On Tuesday, 24 January 2017 at 08:49:17 UTC, Ali Çehreli wrote:
On 01/24/2017 12:47 AM, Ali Çehreli wrote:

> Lvalues are passed by reference and rvalues are copied.

I keep making that mistake! Despite the by-copy syntax, rvalues are moved.

Ali

Further note that you can use conditional compilation with `__traits(isRef)` as in

struct S {}

void f()(auto ref const S x)
{
static if (__traits(isRef, x)) // l-value `x` was passed by ref
    {
        // special treatment of const ref x
    }
    else  // r-value `x` was passed by move
    {
        // `x´ can be reused, for instance in a move-return
    }
}

This is actually a very useful feature in some cases.

Used, for instance, in gmp-d announced yesterday here

http://forum.dlang.org/thread/mwkehzkdbwzygngea...@forum.dlang.org

for clever expression template optimization possible. AFAIK a D-only feature.

Reply via email to