On Mon, 09 Aug 2010 10:53:48 -0400, BCS <n...@anon.com> wrote:

Hello Steven,

On Mon, 09 Aug 2010 10:37:14 -0400, BCS <n...@anon.com> wrote:

Hello Steven,

On Mon, 09 Aug 2010 10:11:39 -0400, Don <nos...@nospam.com> wrote:

Steven Schveighoffer wrote:

On Sun, 08 Aug 2010 17:56:25 -0400, simendsjo
<simen.end...@pandavre.com> wrote:
I'm totally new to the const/immutable thing, so this might be a
naive  question..
The spec says:
"modification after casting away const" => "undefined behavior"
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?
-Steve
I think you're wrong. It's OK to cast away const, as long as you
don't
modify the thing which is supposed to be const.
But if you modify it, there's no way the compiler can guarantee
that
your code will work. Anything could happen.
But then what is the point of casting away const?  If you are not
going to  modify it, then there is no reason to cast it away.

There are some cases where non-const pointers are used but never
modified (C api's for instance) cast as always is just a way subvert
the  type system where it gets in your way.

C's api can be modified at declaration.  It has no mangling, so you
can  type it how it should be (if C had const).  For example:
 extern(C) int strlen(const(char)* str);
 I find that much more pleasant than having to cast away const.

OTOH that is effectively a hidden cast and has 100% of the same issues (re undefined behavior) as casting away const while being slightly harder to find.

But you just said that casting and reading is not undefined? Isn't this the same thing?

Const is such a strange beast because it plays no role in code generation, it's effectively only a tool to help the compiler decide what is possible. It doesn't occupy any space or translate whatsoever to the underlying code.

I think there are definite good uses for writing to const or immutable data besides ones that can be stored in ROM. That is, if you are sure a const or immutable piece of data is on the heap/stack, it should be reasonable to be able to modify it for performance gains.

-Steve

Reply via email to