My thoughts & tries with rvalue references
Namespace
rswhite4 at googlemail.com
Tue Apr 2 08:08:18 PDT 2013
On Saturday, 30 March 2013 at 12:00:32 UTC, Namespace wrote:
> As far as I studied the code, something like @ref isn't
> possible, because ref is already a keyword. Except as
> Pseudo-property. But this is a combination of '@' and 'ref' so
> that both, '@ref' and '@ ref' would be valid.
> I still like the idea of '&A'.
I have to disagree with me here.
Thanks to this thread
(http://forum.dlang.org/thread/ohjdraaizvwiczifwrlk@forum.dlang.org)
I know now that after the '@' can be an unlimited number of white
spaces.
Hence my previous speculation that I would have implemented
something wrong is wrong. So is something like '@ref' possible
and already implemented, as you can see here:
https://github.com/Dgame/dmd/tree/rvalue_property
I think this is probably the end result of my little journey. Any
objections?
Quick example:
[code]
struct A {
public:
ubyte id;
this(ubyte id) {
this.id = id;
}
this(this) {
writeln("postblit of #", this.id);
}
}
void foo(@ref A a) {
writeln(":: id = ", a.id);
}
void foo1(@ref const A a) {
writeln(":: id = ", a.id);
}
void foo2(@ref shared A a) {
writeln(":: id = ", a.id);
}
void foo3(@ref immutable A a) {
writeln(":: id = ", a.id);
}
// void foo4(@ref lazy A a) { /// Error: incompatible parameter
storage classes
// writeln(":: id = ", a.id);
// }
// void foo5(@ref ref A a) { /// Error: redundant storage class
ref
// writeln(":: id = ", a.id);
// }
// void foo6(@ref out A a) { /// Error: incompatible parameter
storage classes
// writeln(":: id = ", a.id);
// }
void bar(@ref int a) {
writeln(a);
}
void quatz(T)(@ref T t) {
static if (is(T == struct))
writeln(t.id);
else
writeln(t);
}
[/code]
More information about the Digitalmars-d
mailing list