On Monday, 1 February 2016 at 20:53:35 UTC, Artur Skawina wrote:
On 02/01/16 21:42, Artur Skawina wrote:
On 02/01/16 20:47, Meta via Digitalmars-d-learn wrote:
That looks much nicer. It still needs work to properly handle
functions with non-empty argument lists.
Then it gets a bit long for a one-liner ;)
enum isLvalue(A...) = is(typeof((ref _){}(A[0](A[1..$]))))
|| is(typeof((ref _){}(A[0])));
And it's of course wrong in case there is a zero-args
ref-returning overload present. So...
enum isLvalue(A...) = A.length>1?is(typeof((ref
_){}(A[0](A[1..$])))):is(typeof((ref _){}(A[0])));
artur
Hmm, I think it can be simplified by replacing `A[0](A[1..$])`
with `A(Parameters!A.init)`. Then the whole thing becomes:
enum isLvalue(alias A) = is(typeof((ref _) {}
(A(Parameters!A.init))));
*However*, we then run into this problem:
int n;
ref int returnN(int, float, bool) { return n; }
ref int returnN() { return n; }
static assert(isLvalue!returnN);
If I remember correctly this will just check the first returnN
declaration.