www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Struct dtor on ref variable

reply Patric <patric.dexheimer gmail.com> writes:
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?
Aug 01 2016
parent reply Steven Schveighoffer <schveiguy yahoo.com> writes:
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
Aug 01 2016
next sibling parent reply Patric <patric.dexheimer gmail.com> writes:
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
Aug 01 2016
parent Mike Parker <aldacron gmail.com> writes:
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
Aug 01 2016
prev sibling next sibling parent reply Patric <patric.dexheimer gmail.com> writes:
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 :)
Aug 01 2016
parent Mike Parker <aldacron gmail.com> writes:
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 :)
Aug 01 2016
prev sibling parent reply Patric <patric.dexheimer gmail.com> writes:
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?
Aug 01 2016
parent reply Mike Parker <aldacron gmail.com> writes:
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.
Aug 01 2016
parent Patric <patric.dexheimer gmail.com> writes:
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 :)
Aug 01 2016