Vision for the D language - stabilizing complexity?

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Thu Jul 14 11:49:36 PDT 2016


On 7/14/16 1:46 PM, Jesse Phillips wrote:
> On Thursday, 14 July 2016 at 16:47:20 UTC, Ola Fosheim Grøstad wrote:
>> On Thursday, 14 July 2016 at 16:17:19 UTC, Jesse Phillips wrote:
>>> I still haven't found someone who can explain how C++ can define the
>>> behavior of modifying a variable after casting away const.
>>
>> C++ is locked down in a mine-field of backward compatibility issues
>> and a need to interface with C verbatim (directly including C header
>> files where const parameters might lack the const modifier).
>>
>> D does not work with C header files and can redefine the interfaces to
>> fit D semantics in C bindings...
>
> That doesn't explain how you can define the behavior:
>
>     void foo(int const* p) {
>         *(const_cast<int*>(p)) = 3;
>     }
>
> Does 'p' get modified or is the program going to crash or something
> else? Please define it for me. C++ says: You can't modify the location
> pointed to by 'p' from 'p', using const_cast on 'p' you'll either get
> undefined behavior or it will modify the location 'p' points to. So it
> is defined to either be undefined or modify the location 'p' refers to.
> The language isn't able to tell you what will happen so how can it
> define the behavior?

That section means the compiler will stop you from doing it unless you 
cast it away :)

That is:

*p = 3;

is a compiler error. That's all the note is saying.

What defining the behavior means is that the compiler has to take into 
account that a variable can change even though all available accesses to 
it are const.

For example:

int x = 5;
foo(&x);
int y = x;

If what you wrote is UB (as it is in D), then the compiler can go ahead 
and assign 5 to y.

In C++, the compiler has to reload x, because it may have changed.

Someone explained this to me recently on the NG.

-Steve


More information about the Digitalmars-d mailing list