cannot implicitly convert char[] to string

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Aug 15 15:12:53 PDT 2015


On 08/15/2015 04:45 AM, cym13 wrote:

 > On Saturday, 15 August 2015 at 11:34:01 UTC, cym13 wrote:
 >> On Saturday, 15 August 2015 at 11:25:20 UTC, vladde wrote:
 >>> I made a PR to phobos where I modified `std.format.format`.
 >>> https://github.com/D-Programming-Language/phobos/pull/3528
 >>>
 >>> However the auto builder fails, with the error message:
 >>>> runnable/test23.d(1219): Error: cannot implicitly convert expression
 >>>> (format("s = %s", s)) of type char[] to string
 >>>
 >>> The line which fails is `p = std.string.format("s = %s", s);`
 >>>
 >>> I don't understand why I can't convert a char[] to string.
 >>
 >> I think it has to do with the fact that string is an alias to
 >> immutable(char)[]   and you can't implicitely cast an immutable to a
 >> regular variable.

That's actually correct (for reference types). As long as there is no 
indirection, a value type can be casted implicitly:

struct S
{
     int i;
}

void main()
{
     auto i = immutable(S)();
     auto m = S();

     m = i;    // copied; fine
}

 > I phrased it completely wrong, an example will be better :
 >
 >      import std.stdio;
 >
 >      void fun(immutable(int)[] i) {
 >          i.writeln();
 >      }
 >
 >      void main() {
 >          int[] i = [42];
 >          fun(i);
 >      }
 >
 > Will not compile because there is no certainty that fun() won't
 > change the array

Actually, that's the job of 'const'. Here, it is not fun's ability to 
mutate but the caller's. 'immutable' on a function interface means a 
requirement: The caller *must* provide immutable data so that the 
function can rely on it not being changed by anyone.

Ali



More information about the Digitalmars-d-learn mailing list