<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2013/4/29 Sönke Ludwig <span dir="ltr"><<a href="mailto:sludwig@outerproduct.org" target="_blank">sludwig@outerproduct.org</a>></span><br><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I noticed that the following doesn't work anymore:<br>
<br>
---<br>
class Test {<br>
    this()<br>
    {<br>
        // ...<br>
    }<br>
}<br>
<br>
void main()<br>
{<br>
    auto test = new shared Test; // Error: non-shared method<br>
shared_obj.Test.this is not callable using a shared object<br>
    //auto test cast(shared)new Text; // still works, but ugly and with<br>
dangerous semantics<br>
}<br>
---<br></blockquote><div><br></div><div>First of all, this is a new feature from 2.063 - qualified constructor support.</div><div>In the definition of the class Test, mutable constructor this() could construct only non-shared objects. Then you cannot create shared object by using it.</div>
<div> </div><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
This one hurts a lot because it (again) destroys the only way to use<br>
shared objects in a generally acceptable way (i.e. without coding<br>
everything twice, once with "shared" and once without, and without casts<br>
everywhere):<br>
<br>
1. Write the class without explicit "shared" support<br>
2. Creates shared objects where needed using "new shared ClassName"<br>
3. Use a special "lock()" function that locks the object and safely<br>
casts away shared during the lock</blockquote><div><br></div><div>One proper way is adding shared constructor overload. Now it would be correctly selected for the construction.</div><div>class Test {</div><div>    this() {}   // for non-shared mutable construction</div>
<div>    this() shared {}    // for shared mutable object construction</div><div>}</div><div>new Test();   // this() is used</div><div>new shared Test();  // this() shared is used</div><div><br></div><div>One another way is make the constructor 'pure'. If a pure constructor satisfies some conditions, it would become to 'unique constructor'.</div>
<div><br></div><div>class Test {</div><div>    this() pure {}   // </div><div>}</div><div><div>new Test();   // this() pure is used</div><div>new shared Test();  // this() pure is used!</div><br class=""></div><div><div>In default, this() is used for non-shared mutable object.</div>
<div>But pure attribute enforces that the constructed object does not hold any "non-shared mutable global data" implicitly, then compiler can guarantee that the constructed object is unique.</div></div><div>Unique object can be convertible to any qualifier, then implicit conversion to shared is accepted.</div>
<div><br></div><div>Thanks.</div><div><br></div><div>Kenji Hara</div></div></div></div>