digitalmars.D - Doubt about alias this
- d coder (27/27) Dec 06 2012 Greetings
- Phil Lavoie (48/48) Dec 06 2012 Hi,
Greetings
Kindly take a look at the code below. I am using alias this with a function
that returns by value. I believe in such cases the alias should not take
affect when an instance of foo is being used as an lvalue. As a result
elements of bar should not have been visible inside the constructor of foo.
Please comment. Is this a bug?
Regards
- Puneet
struct bar (bool B, N...) {
int n = 0;
}
struct foo (N...) {
bar!(true, N) _bar = void;
bar!(true, N) getN() {
return _bar;
}
alias getN this;
public this(T) (T other)
if (is(T unused : int)) {
n = other;
}
}
void main() {
import std.stdio;
foo!8 a = 42;
writeln(a.n);
}
Dec 06 2012
Hi,
I tested the code you provided and extended it a little and here
is the result:
struct bar (bool B, N...) {
int n = 0;
}
struct foo (N...) {
bar!(true, N) _bar = void;
bar!(true, N) getN() {
return _bar;
}
alias getN this;
public this(T) (T other)
if (is(T unused : int)) {
n = other;
}
}
void aFunc( bar!( true, 8 ) zeBar ) {
//Subtyping compiles.
}
bar!( true, 8 ) aSecondFunc() {
return bar!( true, 8 )();
}
struct toto{
size_t payload;
}
toto aThirdFunc() {
return toto();
}
void main() {
import std.stdio;
foo!8 a = 42;
writeln(a.n); //Prints 0, as it should.
aFunc( a ); //The alias this correctly allows for subtyping, as
advertised
a.getN().n = 3; //Allowing for rvalue manipulation is indeed
weird, but apparently in a coherent fashion, not just for the
alias this case.
writeln(a.n); //Still prints 0, as it should.
aSecondFunc().n = 4;
aThirdFunc().payload = 10; //Without alias this, without
templates, juste plain rvalue. Another coherent example, yet
questionably permitted.
}
Therefore, your question, I believe, is more related to rvalues
directly rather than alias this, if I get your meaning right. The
question is still very relevant and I was surprised to find out
about the current behaviors of rvalues.
Dec 06 2012








"Phil Lavoie" <maidenphil hotmail.com>