Thread overview
immutable constructor and semantics of two construction syntaxes
Apr 14, 2013
Ali Çehreli
Apr 14, 2013
Timon Gehr
Apr 14, 2013
deadalnix
April 14, 2013
When immutable constructors are implemented, will there be a difference between the two syntaxes below?

struct MyStruct
{
    int i;

    // ... assume that MyStruct has both
    // mutable and immutable constructors ...
}

    auto s0 = immutable(MyStruct)("some parameter");

    immutable s1 = MyStruct("some parameter");

The former syntax constructs an immutable literal, so the type of s0 is deduced to be immutable.

The latter syntax constructs a mutable literal and blits it to the immutable s1.

Should the former syntax call the immutable constructor and the latter syntax call the mutable constructor?

Ali
April 14, 2013
On 04/14/2013 02:48 AM, Ali Çehreli wrote:
> When immutable constructors are implemented, will there be a difference
> between the two syntaxes below?
>
> struct MyStruct
> {
>      int i;
>
>      // ... assume that MyStruct has both
>      // mutable and immutable constructors ...
> }
>
>      auto s0 = immutable(MyStruct)("some parameter");
>
>      immutable s1 = MyStruct("some parameter");
>
> The former syntax constructs an immutable literal, so the type of s0 is
> deduced to be immutable.
>
> The latter syntax constructs a mutable literal and blits it to the
> immutable s1.
>
> Should the former syntax call the immutable constructor and the latter
> syntax call the mutable constructor?
>
> Ali

I guess so. But it does not really make sense to declare an immutable constructor if the struct instances implicitly convert between mutable and immutable.
April 14, 2013
On Sunday, 14 April 2013 at 08:03:16 UTC, Timon Gehr wrote:
> On 04/14/2013 02:48 AM, Ali Çehreli wrote:
>> When immutable constructors are implemented, will there be a difference
>> between the two syntaxes below?
>>
>> struct MyStruct
>> {
>>     int i;
>>
>>     // ... assume that MyStruct has both
>>     // mutable and immutable constructors ...
>> }
>>
>>     auto s0 = immutable(MyStruct)("some parameter");
>>
>>     immutable s1 = MyStruct("some parameter");
>>
>> The former syntax constructs an immutable literal, so the type of s0 is
>> deduced to be immutable.
>>
>> The latter syntax constructs a mutable literal and blits it to the
>> immutable s1.
>>
>> Should the former syntax call the immutable constructor and the latter
>> syntax call the mutable constructor?
>>
>> Ali
>
> I guess so. But it does not really make sense to declare an immutable constructor if the struct instances implicitly convert between mutable and immutable.

I was about to answer exactly the same.

Note that s1 should fail is immutable => mutable conversion can't be done implicitly (if MyStruct contains references).