Thread overview
Struct dtor on ref variable
Aug 01, 2016
Patric
Aug 01, 2016
Patric
Aug 01, 2016
Mike Parker
Aug 01, 2016
Patric
Aug 01, 2016
Mike Parker
Aug 01, 2016
Patric
Aug 01, 2016
Mike Parker
Aug 01, 2016
Patric
August 01, 2016
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
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
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
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
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
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
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
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
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 :)