Can a struct be copied by its const method?

Ivan Kazmenko gassa at mail.ru
Fri Aug 2 09:23:06 PDT 2013


On Friday, 2 August 2013 at 15:47:49 UTC, monarch_dodra wrote:
> On Friday, 2 August 2013 at 15:06:34 UTC, Ivan Kazmenko wrote:
>> The question is as stated: can a struct be copied by its const 
>> method?  I'd expect the answer to be the same for any struct, 
>> but the following two examples say different.  I'm using DMD 
>> 2.063.2 on Windows.
>> <...>
>
> To answer real quick, I think the problem is when your type has 
> aliasing, then dmd has no way of ensuring that after the 
> postblit, your new struct won't alias any data in the old 
> struct. Because of this, it is simply not able to generate an 
> "opAssign(const struct rhs)", and only provides 
> "opAssign(Struct rhs)".
>
> If you add these implementation yourself:
>
>   ref Struct opAssign(const ref Struct rhs)
>   {
>     //Pass by ref. make a dup
>     arr = rhs.arr.dup;
>     return this;
>   }
>   ref Struct opAssign(const Struct rhs)
>   {
>     //pass by value
>     //postblit has already been dup'ed, so we can just force 
> alias
>     arr = cast(int[])rhs.arr;
>     return this;
>   }
>
> The problem seems to get fixed.
>
> As a side note, implementing these yourself tends to be faster 
> then relying on a postblit implemented opAssign.

Thank you!  After adding the appropriate opAssign-s, everything 
seems to work as intended.


More information about the Digitalmars-d-learn mailing list