Thread overview
container vs standard array
Sep 19, 2023
vino
Sep 19, 2023
JG
Sep 19, 2023
Nick Treleaven
Sep 19, 2023
Nick Treleaven
Sep 19, 2023
vino
September 19, 2023

Hi All,

I am trying to understand as to why the below code is throwing error

Code

import std.stdio: writeln;
import std.container.array;

void main () {
 //auto a = Array!string("Aname");           // throws error
 auto b = Array!char("Bname");             	// works
 auto c = Array!string("Aname", "Bname");  	// works

 //writeln(a);
 writeln("Container Array :", b);
 writeln("Container Array :", c);

 writeln();

 string[] d = ["Dname"];			       // works
 string[] e = ["Dname", "Ename"];              // works
 writeln("Standard Array :", d);
 writeln("Standard Array :", e);

}

From,
Vino

September 19, 2023

On Tuesday, 19 September 2023 at 00:34:01 UTC, vino wrote:

>

Hi All,

I am trying to understand as to why the below code is throwing error

Code

import std.stdio: writeln;
import std.container.array;

void main () {
 //auto a = Array!string("Aname");           // throws error
 auto b = Array!char("Bname");             	// works
 auto c = Array!string("Aname", "Bname");  	// works

 //writeln(a);
 writeln("Container Array :", b);
 writeln("Container Array :", c);

 writeln();

 string[] d = ["Dname"];			       // works
 string[] e = ["Dname", "Ename"];              // works
 writeln("Standard Array :", d);
 writeln("Standard Array :", e);

}

From,
Vino
Looks to me like when it receives a single range it expects the elements of that range to match the type. If I am correct in the first one if you replace the "Aname" by ["Aname"] it should work

September 19, 2023

On Tuesday, 19 September 2023 at 06:35:01 UTC, JG wrote:

>

On Tuesday, 19 September 2023 at 00:34:01 UTC, vino wrote:

>

//auto a = Array!string("Aname"); // throws error
auto b = Array!char("Bname"); // works
auto c = Array!string("Aname", "Bname"); // works
...
Looks to me like when it receives a single range it expects the elements of that range to match the type.

Yes, the first overload fails to match because U is inferred as immutable(char) rather than string:

this(U)(U[] values...)
if (isImplicitlyConvertible!(U, T))

This is because a single array can be passed to a typesafe variadic parameter rather than elements of that array type. And then immutable(char) doesn't convert to string.

I think a non-variadic overload could be added to make it work as expected.

September 19, 2023

On Tuesday, 19 September 2023 at 19:57:34 UTC, Nick Treleaven wrote:

>

This is because a single array can be passed to a typesafe variadic parameter rather than elements of that array type. And then immutable(char) doesn't convert to string.

I think a non-variadic overload could be added to make it work as expected.

https://github.com/dlang/phobos/pull/8818

September 19, 2023

On Tuesday, 19 September 2023 at 20:20:17 UTC, Nick Treleaven wrote:

>

On Tuesday, 19 September 2023 at 19:57:34 UTC, Nick Treleaven wrote:

>

This is because a single array can be passed to a typesafe variadic parameter rather than elements of that array type. And then immutable(char) doesn't convert to string.

I think a non-variadic overload could be added to make it work as expected.

https://github.com/dlang/phobos/pull/8818

Thank you very much.