How to break const

Timon Gehr timon.gehr at gmx.ch
Wed Jun 20 08:24:43 PDT 2012


On 06/20/2012 05:17 PM, deadalnix wrote:
> Le 20/06/2012 16:55, Timon Gehr a écrit :
>>>> It works if implicit conversions from 'R delegate(A)' to
>>>> 'R delegate(A) const' are allowed, as well as looking up an
>>>> 'R delegate(A) in a const receiver object.
>>>
>>> What about conversion from/to immutable ?
>>
>> Simple application of transitivity. This part is the same for 1./2.
>>
>> 'R delegate(A)' and 'R delegate(A) const' are not convertible to
>> 'R delegate(A) immutable', but 'R delegate(A) immutable' is
>> convertible to 'R delegate(A)' and 'R delegate(A) const'.
>>
>> 'R delegate(A)' and 'R delegate(A) const' decay to
>> 'R delegate(A) immutable' when stored in an immutable object.
>>
>
> I've gone through a similar reasoning. It does not work.

Yes it does.

> Here are implicit casts summed up :
>
> mutable -> const
> immutable -> const
> immutable -> mutable
>
> which implicitely imply immutable -> const
>
> And then you add when storing in immutable object.
>
> mutable -> immutable
> const -> immutable
>

These are not valid implicit conversions.

What I meant was:

struct S{
     R delegate(A) mutable;
     R delegate(B)const const_;
}

static assert(is(typeof(immutable(S).mutable)==R delegate(A) immutable));
static assert(is(typeof(immutable(S).const_)==R delegate(A) immutable));


> It means that you can store a delegate that have a mutable frame pointer
> into an immutable object, which break transitivity.

No.


More information about the Digitalmars-d mailing list