import std.stdio;
struct A
{
void set(ref B b)
{
myB = &b;
}
void set(B)
{
writeln("Nope.");
}
void voiceOfB()
{
myB.voice();
}
private:
const(B)* myB;
}
struct B
{
this(int v)
{
value = v;
}
~this()
{
value = -1;
}
void voice() const
{
writeln("I am B with value = ", value);
}
ref A setSelfForA(ref A a)
{
a.set(this);
return a;
}
int value = 0;
}
int main(string[] argv)
{
A a;
a.set(B()); // no way to pass this value without copying
// my guess is to try and keep it safe
// but then you get the below case which is possible
// maybe it's just an overlooked detail but it is possible currently..
B(42).setSelfForA(a)
.voiceOfB();
a.voiceOfB();
return 0;
}
CmltcG9ydCBzdGQuc3RkaW87CgpzdHJ1Y3QgQQp7CgogICAgdm9pZCBzZXQocmVmIEIgYikKICAgIHsKICAgICAgICBteUIgPSAmYjsKICAgIH0KCiAgICB2b2lkIHNldChCKQogICAgewogICAgICAgIHdyaXRlbG4oIk5vcGUuIik7CiAgICB9CgogICAgdm9pZCB2b2ljZU9mQigpCiAgICB7CiAgICAgICAgbXlCLnZvaWNlKCk7CiAgICB9CgogICAgcHJpdmF0ZToKCiAgICBjb25zdChCKSogbXlCOwoKfQoKc3RydWN0IEIKewogICAgdGhpcyhpbnQgdikKICAgIHsKICAgICAgICB2YWx1ZSA9IHY7CiAgICB9CgogICAgfnRoaXMoKQogICAgewogICAgICAgIHZhbHVlID0gLTE7CiAgICB9CgogICAgdm9pZCB2b2ljZSgpIGNvbnN0CiAgICB7CiAgICAgICAgd3JpdGVsbigiSSBhbSBCIHdpdGggdmFsdWUgPSAiLCB2YWx1ZSk7CiAgICB9CgogICAgcmVmIEEgc2V0U2VsZkZvckEocmVmIEEgYSkKICAgIHsKICAgICAgICBhLnNldCh0aGlzKTsKICAgICAgICByZXR1cm4gYTsKICAgIH0KCiAgICBpbnQgdmFsdWUgPSAwOwp9CgppbnQgbWFpbihzdHJpbmdbXSBhcmd2KQp7CiAgICBBIGE7CgogICAgYS5zZXQoQigpKTsgLy8gbm8gd2F5IHRvIHBhc3MgdGhpcyB2YWx1ZSB3aXRob3V0IGNvcHlpbmcKICAgICAgICAgICAgICAgIC8vIG15IGd1ZXNzIGlzIHRvIHRyeSBhbmQga2VlcCBpdCBzYWZlCiAgICAgICAgICAgICAgICAvLyBidXQgdGhlbiB5b3UgZ2V0IHRoZSBiZWxvdyBjYXNlIHdoaWNoIGlzIHBvc3NpYmxlCiAgICAgICAgICAgICAgICAvLyBtYXliZSBpdCdzIGp1c3QgYW4gb3Zlcmxvb2tlZCBkZXRhaWwgYnV0IGl0IGlzIHBvc3NpYmxlIGN1cnJlbnRseS4uCgogICAgQig0Mikuc2V0U2VsZkZvckEoYSkKICAgICAgICAgLnZvaWNlT2ZCKCk7CgogICAgYS52b2ljZU9mQigpOwoKICAgIHJldHVybiAwOwp9