I just got it! (invariant/const)
Georg Wrede
georg at nospam.org
Wed Apr 9 10:36:34 PDT 2008
Steven Schveighoffer wrote:
> "Georg Wrede" wrote
>
>>Janice Caron wrote:
>>
>>>On 09/04/2008, Denton Cockburn wrote:
>>>
>>>
>>>>>Of course, the explicit cast necessary to
>>>>>create an invariant C in the first place is a bit ugly. Maybe we need
>>>>>"inew" to make new invariant objects?
>>>>
>>>>Couldn't the compiler insert the cast based on the declaration?
>>>
>>>
>>>No, because objects created by new are not necessarily transitively
>>>unique. For example
>>>
>>> class C
>>> {
>>> int * p;
>>>
>>> this()
>>> {
>>> p = &someGlobalVariable;
>>> }
>>> }
>>>
>>> invariant C c = cast(invariant) new C;
>>> someGlobalVariable = 1;
>>>
>>>Whoops! c just changed!
>>>
>>>The explicit cast makes it the programmer's fault, not the compiler's!
>>>
>>>Come to think of it, "inew" would suffer the exact same problem, so it
>>>doesn't solve anything. Looks like there's no easy way to make an
>>>invariant class instance.
>>
>>It should be illegal to cast objects invariant unless the compiler can
>>guarantee the invariantness. So the cast here should produce an error.
>
> This cannot be guaranteed by the compiler. It is depending on you to ensure
> that the object stays invariant. From
> http://www.digitalmars.com/d/2.0/const3.html
>
> "The second way (to create invariant data) is to cast data to invariant.
> When doing so, it is up to the programmer to ensure that no other mutable
> references to the same data exist."
My mistake.
More information about the Digitalmars-d
mailing list