On Thursday, 22 June 2017 at 20:05:46 UTC, Ali Çehreli wrote:
To be complete, 'auto ref' passes lvalues by reference and rvalues by value, which you can detect with __traits(isRef):

struct S{
}

void foo()(auto ref S s) {
    static if (__traits(isRef, s)) {
        pragma(msg, "lvalue");
    } else {
        pragma(msg, "rvalue");
    }
}

void main() {
    auto s = S();
    foo(s);

    foo(S());
}

Ali

Thank you very much! And the last question:
Is it guaranteed an all compilers, that:
1). destructor for said rvalue is called only once.
2). function taking auto ref parameter gets that exact (memory-wise) rvalue, for example:

struct S {}

S produce() { return S(); }

consume(produce());

void consume(auto ref S s)
{
// s passed by value, but is exactly that struct returned by produce, as if it
  // was RVO'd inside consume's stack frame.
  // and S destructor called only once on consume's scope escape?
}

Reply via email to