Cannot always deduce template arguments when using implicitly cast array literals

HuskyNator HuskyNator at protonmail.ch
Thu Apr 21 15:59:24 UTC 2022


On Friday, 23 July 2021 at 13:53:27 UTC, Rekel wrote:
> As one can see, implicitly casting array literals in templates 
> works fine in the case of bar, as does explicit use of 
> templates in the case of foo, but for some reason foo does not 
> manage to deduce its arguments like bar does.

Interestingly enough, I ran into the same issue recently, but 
with a much simpler piece of code:

```d
module app;
import std.stdio;

struct One(T, uint L) {
	T[L] array;

	bool opEquals(T2)(const T2[L] rhs) const {
		return true;
	}
}

struct Two(T, uint L) {
	T[L][L] array;

	bool opEquals(T2)(const T2[L][L] rhs) const {
		return true;
	}
}

void foo() {
	auto a = One!(float, 2)([1, 2]);
	int[2] b = [1, 2];

	writeln(a == b); // True
	writeln(a.array == b); // True

	writeln(a == [1, 2]); // True
	writeln(a.array == [1, 2]); // True
}

void bar() {
	auto a = Two!(float, 2)([[1, 2], [3, 4]]);
	int[2][2] b = [[1, 2], [3, 4]];

	writeln(a == b); // True
	writeln(a.array == b); // True

	writeln(a == [[1, 2], [3, 4]]); // cannot deduce function from 
argument types `!()(int[][])`
	writeln(a.array == [[1, 2], [3, 4]]); // True
}

void main(){
	foo();
	bar();
}
```

I'd love to know if there's any plans on changing/fixing this. I 
haven't been able to find any mention of it apart from in this 
thread.

Kind regards,
~ HN
(/Rekel: name change & account loss. It'd be nice if the forum 
supported editing & profiles (including posts/comments or at 
least login credential retrieval (like https://code.dlang.org/ 
does))


More information about the Digitalmars-d-learn mailing list