| Thread overview | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
August 01, 2016 Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
struct Test{
int x;
this(int v){
x = v;
writeln(x.to!string ~ " Created");
}
~this(){
writeln(x.to!string ~ " Destroyed");
}
void opOpAssign(string op, Type)(ref Type s){
x = s.x;
}
}
void showme(Type)(ref Type t){
writeln(t.x);
}
void main(){
auto t = Test(1);
auto t2 = Test(2);
showme(t);
showme(t2);
t = t2;
}
Prints:
1 Created
2 Created
1
2
1 Destroyed
2 Destroyed
2 Destroyed
this line:
t = t2
Causes the dtor to be called.
Why?
I expected nothing to happen because "ref" its a simple pointer, right?
Or I am missing something here?
| ||||
August 01, 2016 Re: Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Patric | On 8/1/16 12:01 PM, Patric wrote:
> I expected nothing to happen because "ref" its a simple pointer, right?
> Or I am missing something here?
>
You want opAssign, not opOpAssign. opOpAssign is for things like +=.
Your code had me worried for a while :)
-Steve
| |||
August 01, 2016 Re: Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Monday, 1 August 2016 at 16:05:51 UTC, Steven Schveighoffer wrote: > On 8/1/16 12:01 PM, Patric wrote: > >> I expected nothing to happen because "ref" its a simple pointer, right? >> Or I am missing something here? >> > > You want opAssign, not opOpAssign. opOpAssign is for things like +=. > > Your code had me worried for a while :) > > -Steve Same thing: (Remembered now of DPaste) (and I understand your concern :P) https://dpaste.dzfl.pl/af512b5f6288 | |||
August 01, 2016 Re: Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Monday, 1 August 2016 at 16:05:51 UTC, Steven Schveighoffer wrote:
> On 8/1/16 12:01 PM, Patric wrote:
>
>> I expected nothing to happen because "ref" its a simple pointer, right?
>> Or I am missing something here?
>>
>
> You want opAssign, not opOpAssign. opOpAssign is for things like +=.
>
> Your code had me worried for a while :)
>
> -Steve
Sorry, silly me, forgot to remove the "string op" now its ok :)
| |||
August 01, 2016 Re: Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Patric | On Monday, 1 August 2016 at 16:14:31 UTC, Patric wrote: > On Monday, 1 August 2016 at 16:05:51 UTC, Steven Schveighoffer wrote: >> On 8/1/16 12:01 PM, Patric wrote: >> >>> I expected nothing to happen because "ref" its a simple pointer, right? >>> Or I am missing something here? >>> >> >> You want opAssign, not opOpAssign. opOpAssign is for things like +=. >> >> Your code had me worried for a while :) >> >> -Steve > > Same thing: > (Remembered now of DPaste) > (and I understand your concern :P) > https://dpaste.dzfl.pl/af512b5f6288 You've implemented opAssign incorrectly. See: https://dlang.org/spec/operatoroverloading.html#assignment | |||
August 01, 2016 Re: Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Monday, 1 August 2016 at 16:05:51 UTC, Steven Schveighoffer wrote:
> On 8/1/16 12:01 PM, Patric wrote:
>
>> I expected nothing to happen because "ref" its a simple pointer, right?
>> Or I am missing something here?
>>
>
> You want opAssign, not opOpAssign. opOpAssign is for things like +=.
>
> Your code had me worried for a while :)
>
> -Steve
But still.
If it was the case of "+=" wasn´t wrong to call the dtor since is a ref var?
| |||
August 01, 2016 Re: Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Patric | On Monday, 1 August 2016 at 16:17:02 UTC, Patric wrote:
> On Monday, 1 August 2016 at 16:05:51 UTC, Steven Schveighoffer wrote:
>> On 8/1/16 12:01 PM, Patric wrote:
>>
>>> I expected nothing to happen because "ref" its a simple pointer, right?
>>> Or I am missing something here?
>>>
>>
>> You want opAssign, not opOpAssign. opOpAssign is for things like +=.
>>
>> Your code had me worried for a while :)
>>
>> -Steve
>
> Sorry, silly me, forgot to remove the "string op" now its ok :)
Well, you beat me to it :)
| |||
August 01, 2016 Re: Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Patric | On Monday, 1 August 2016 at 16:18:32 UTC, Patric wrote:
> But still.
> If it was the case of "+=" wasn´t wrong to call the dtor since is a ref var?
No. It was working as expected. You never implemented opAssign, so default assignment was being used. There was no ref variable.
| |||
August 01, 2016 Re: Struct dtor on ref variable | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On Monday, 1 August 2016 at 16:21:16 UTC, Mike Parker wrote:
> On Monday, 1 August 2016 at 16:18:32 UTC, Patric wrote:
>
>> But still.
>> If it was the case of "+=" wasn´t wrong to call the dtor since is a ref var?
>
> No. It was working as expected. You never implemented opAssign, so default assignment was being used. There was no ref variable.
Iep, I realized this by now. Thanks anyway :)
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply