digitalmars.D.learn - Struct dtor on ref variable
- Patric (38/38) Aug 01 2016 struct Test{
- Steven Schveighoffer (4/6) Aug 01 2016 You want opAssign, not opOpAssign. opOpAssign is for things like +=.
- Patric (6/15) Aug 01 2016 Same thing:
- Mike Parker (3/22) Aug 01 2016 You've implemented opAssign incorrectly. See:
- Patric (3/12) Aug 01 2016 Sorry, silly me, forgot to remove the "string op" now its ok :)
- Mike Parker (2/18) Aug 01 2016 Well, you beat me to it :)
- Patric (5/14) Aug 01 2016 But still.
- Mike Parker (3/6) Aug 01 2016 No. It was working as expected. You never implemented opAssign,
- Patric (2/8) Aug 01 2016 Iep, I realized this by now. Thanks anyway :)
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
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
On Monday, 1 August 2016 at 16:05:51 UTC, Steven Schveighoffer wrote:On 8/1/16 12:01 PM, Patric wrote:Same thing: (Remembered now of DPaste) (and I understand your concern :P) https://dpaste.dzfl.pl/af512b5f6288I 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
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:You've implemented opAssign incorrectly. See: https://dlang.org/spec/operatoroverloading.html#assignmentOn 8/1/16 12:01 PM, Patric wrote:Same thing: (Remembered now of DPaste) (and I understand your concern :P) https://dpaste.dzfl.pl/af512b5f6288I 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
On Monday, 1 August 2016 at 16:05:51 UTC, Steven Schveighoffer wrote:On 8/1/16 12:01 PM, Patric wrote:Sorry, silly me, forgot to remove the "string op" now its ok :)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
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:Well, you beat me to it :)On 8/1/16 12:01 PM, Patric wrote:Sorry, silly me, forgot to remove the "string op" now its ok :)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
On Monday, 1 August 2016 at 16:05:51 UTC, Steven Schveighoffer wrote:On 8/1/16 12:01 PM, Patric wrote:But still. If it was the case of "+=" wasn´t wrong to call the dtor since is a ref var?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
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
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:Iep, I realized this by now. Thanks anyway :)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








 
  
  
 
 Mike Parker <aldacron gmail.com>
 Mike Parker <aldacron gmail.com> 