"template with auto ref" experiment

kinke via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Feb 4 08:18:00 PST 2017


On Saturday, 4 February 2017 at 14:33:12 UTC, Alex wrote:
> Having read this
> https://dlang.org/spec/template.html#auto-ref-parameters
>
> I tried to do something like this
>
> // Code starts here
> void main()
> {
> 	initStruct iSb;
> 	iSb.var = 3;
> 	A b = A(iSb);
> 	assert(*b.myVar == 3); // this works
> 	iSb.var = 4;
> 	assert(*b.myVar == 4); // as expected
> 	
> 	b = A(initStruct(5)); // how does
> 	assert(*b.myVar == 5); // this work?
> }
>
> struct A
> {
> 	@disable this();
> 	size_t* myVar;
> 	this()(auto ref initStruct iS) @nogc
> 	{
> 		import core.stdc.stdio;
> 		__traits(isRef, iS) ? printf("ref case\n") : printf("value 
> case");
> 		
> 		myVar = &iS.var;
> 		
> 		/* // This treatment is not needed?
> 		if(__traits(isRef, iS))
> 		{
> 			myVar = &iS.var;
> 		}
> 		else
> 		{
> 			myVar = new size_t(iS.var);
> 		}
> 		*/	
> 	}
> }
>
> struct initStruct
> {
> 	size_t var;
> }
> // Code ends here
>
> All asserts pass. But the question is how it is possible to 
> avoid the allocation of memory for the member var of the struct 
> A in the second case. Is the input remains somewhere and I'm 
> not aware of this?
> By the way, I find the fact very cool. I'm just wondering, 
> whether I'm doing something unsecure...

It most likely only works because the dangling pointer points 
into yet untouched stack. Trying to öet a normal by-value 
parameter or local variable escape this way should produce an 
error, but apparently it's not done for `auto ref` parameters 
(the compiler should though, but only in the 
by-value-template-instantiation).
So this isn't cool at all ;) - please consider filing a bugreport 
about this.


More information about the Digitalmars-d-learn mailing list