inferred vs. annotated attributes
Lodovico Giaretta via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Sep 10 02:38:15 PDT 2016
On Saturday, 10 September 2016 at 08:23:35 UTC, Q. Schroll wrote:
> Is there a difference between inferred and annotated attributes?
> Example:
>
> struct X(T)
> {
> this(S)(in S[] arr) // inferred pure
> { }
> }
>
> void main() pure
> {
> X!uint mut = [ 1, 2 ]; // proves inference (cf. main is
> pure)
> // immutable X!uint imm1 = [ 1, 2 ];
> // auto imm2 = immutable X!uint([1, 2]);
> }
>
> The commented lines yield error messages claiming the
> constructor cannot deduce function from argument types
> !()(int[]) immutable, however it can, if "pure" is explicitly
> annotated.
>
> Is this a bug or did I get something wrong about inference /
> unique expressions?
A method (included ctors) that is not annotated const, nor
immutable, nor inout, is implicitly mutable. This implies that
your ctor is mutable, and as such it cannot create immutable
instances.
If you add another ctor marked immutable, everything works. An
alternative is to mark the ctor as inout.
I tested this solution and it works, but I'm not sure if it is by
design.
More information about the Digitalmars-d-learn
mailing list