Some strange parameter deduction problems in opOpAssign and opBinary

Ivan Agafonov armadil at yandex.ru
Sat Sep 1 22:08:59 PDT 2012


On Sunday, 2 September 2012 at 04:10:39 UTC, Ivan Agafonov wrote:
> There are 3 separated versions of opOpAssign
> first version must be the same as the second for Vec!(sometype, 
> 4)
> why it doesn't work?
>
> Simplified code:
>
> struct Vec(T, uint size)
> {
> 	this(T rhs) { array[] = rhs; }
> 	
> 	// It doesn't work but compiles
> 	ref Vec!(T, size) opOpAssign(string op) (Vec!(T, size) rhs)
> 	{
> 		mixin("array[] "~op~"= rhs.array[];");
> 		return this;
> 	}
> 	
> 	// but it work's
> 	ref Vec!(T, 4) opOpAssign(string op) (Vec!(T, 4) rhs)
> 	{
> 		mixin("array[] "~op~"= rhs.array[];");
> 		return this;
> 	}
> 	
> 	// and this work;s
> 	ref Vec!(T, size) opAddAssign(Vec!(T, size) rhs)
> 	{
> 		array[] += rhs.array[];
> 		return this;
> 	}
> 	
> 	T[size] array = 0;
> }
>
> int main()
> {
> 	auto z = Vec!(float, 4)(5.0f);
> 	z += z;
> 	writeln(z);
> 	return 0;
> }

Problem solved:

alias Vec!(T, size) V;

// This works fine
ref V opOpAssign(string op)(V rhs)
{
	mixin("array[] "~op~"= rhs.array[];");
		return this;
}

But I think this is a bug.


More information about the Digitalmars-d-learn mailing list