Static array as immutable

Ivan Trombley itrombley at dot-borg.org
Tue Dec 12 10:35:15 UTC 2017


On Tuesday, 12 December 2017 at 09:48:09 UTC, Jonathan M Davis 
wrote:
> On Tuesday, December 12, 2017 07:33:47 Ivan Trombley via 
> Digitalmars-d-learn wrote:
>> Is there some way that I can make this array immutable?
>>
>>    static float[256] ga = void;
>>    static foreach (i; 0 .. 256)
>>        ga[i] = (i / 255.0f) ^^ (1 / 2.2f);
>
> If you want anything to be immutable, you either have to 
> initialize it directly or give it a value in a static 
> constructor (and the static constructor solution won't work for 
> local variables). So, you'd need to do something like
>
> static immutable float[256] ga = someFuncThatGeneratesGA();
>
> If the function is pure, and there's no way that the return 
> value was passed to the function, then its return value can be 
> assigned to something of any mutability, since the compiler 
> knows that there are no other references to it, and it can 
> implicitly cast it, or if the type is a value type (as in this 
> case), then you just get a copy, and mutability isn't an issue. 
> Alternatively to using a pure function, you can use 
> std.exception.assumeUnique to cast to immutable, but that 
> relies on you being sure that there are no other references to 
> the data, and it may not work at compile-time, since casting is 
> a lot more restrictive during CTFE. So, in general, using a 
> pure function is preferable to assumeUnique.
>
> - Jonathan M Davis

Ah, it doesn't work. I get this error using the ^^ operator:

/usr/include/dmd/phobos/std/math.d(5724,27): Error: cannot 
convert &real to ubyte* at compile time
/usr/include/dmd/phobos/std/math.d(6629,24):        called from 
here: signbit(x)
/usr/include/dmd/phobos/std/math.d(6756,16):        called from 
here: impl(cast(real)x, cast(real)y)

:(


More information about the Digitalmars-d-learn mailing list