inferred vs. annotated attributes

Q. Schroll via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Sep 10 04:31:07 PDT 2016


On Saturday, 10 September 2016 at 09:38:15 UTC, Lodovico Giaretta 
wrote:
> 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.

IIRC, a pure ctor can construct any objects (including immutable 
and shared).

> If you add another ctor marked immutable, everything works. An 
> alternative is to mark the ctor as inout.

Technically I know. The minimal example only explains the 
problem/bug. My real constructor does do things where I don't 
want inout attributes if I can avoid.

> I tested this solution and it works, but I'm not sure if it is 
> by design.

Sure. It did for me, too.

The question is: Why does annotating an inferred attribute make a 
difference? (Or it doesn't and I don't see it all the time.)


More information about the Digitalmars-d-learn mailing list