Casting away const

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Mon Aug 9 09:08:12 PDT 2010


On Mon, 09 Aug 2010 10:35:02 -0400, Steven Schveighoffer wrote:

> On Mon, 09 Aug 2010 10:27:09 -0400, Don <nospam at nospam.com> wrote:
> 
>> Steven Schveighoffer wrote:
>>> On Mon, 09 Aug 2010 09:57:47 -0400, bearophile
>>> <bearophileHUGS at lycos.com> wrote:
>>>
>>>> Steven Schveighoffer:
>>>>> I thought it was "you're on your own", not undefined behavior.  The
>>>>> former
>>>>> implies there is some "right" way to do this if you know more about
>>>>> the
>>>>> data than the compiler, the latter implies that there is no right
>>>>> way to
>>>>> cast away const.  Am I wrong?
>>>>
>>>> In my opinion if this thing is well designed then you go in undefined
>>>> behaviour only when you change the contents of something after you
>>>> have removed its const nature with a cast. Just casting const away
>>>> and then reading the data can't be undefined behaviour, otherwise
>>>> casting const away is useless and can be totally disallowed.
>>>  Casting away const just to read the data is useless.  You can read
>>> const data without a cast.
>>
>> No you can't. You can't pass it to a C function.
> 
> Sure you can.
> 
> extern(C) int strlen(const(char) *arg);
> 
> 
>>>  But my understanding is that casting away const to write should be
>>> doable if you know what you're doing.  If this is undefined behavior,
>>> then that's fine, I'm just unclear on what "undefined behavior"
>>> actually means.  I thought "undefined behavior" means that you cannot
>>> count on the behavior to work in the future.
>>>  An example of where casting away const to write should be allowed is
>>> for a hypothetical mutable member:
>>>  class C
>>> {
>>>    private Mutable!(int) cache = -1;
>>>    int expensiveFunction() const { return cache == -1 ? cache =
>>> _expensiveFunctionImpl() : cache; }
>>>    private int _expensiveFunctionImpl() const {...}
>>> }
>>>  If this is undefined, then something like this cannot be relied on,
>>> even when performance is critical.
>>>  -Steve
>>
>> I really can't see how the compiler could make that work, without
>> destroying most of the benefits of const. For example, if that code is
>> legal, it disallows most const-related optimisation.
> 
> Why not?  What possible optimization can the compiler do here?  Mutable
> has an assign operation that is labeled as const, it should be callable
> by the compiler.
> 
> I haven't really seen what const optimizations can be, so maybe an
> example (even if unimplemented) is helpful.

The compiler does an "optimization" on const/immutable struct members 
which I reported as a bug:

  http://d.puremagic.com/issues/show_bug.cgi?id=3449

-Lars


More information about the Digitalmars-d-learn mailing list