Why does this not compile?

Steven Schveighoffer schveiguy at yahoo.com
Tue Mar 6 13:56:30 UTC 2018


On 3/6/18 8:42 AM, Simen Kjærås wrote:

> It's a bug. As pointed out elsewhere in this thread, it compiles 
> correctly when there's no destructor. Essentially, this bug is caused by 
> the context pointer being typed as void*, and becoming (of course) 
> const(void*) for a const(S). If it'd been const(void)* in the first 
> place, Shachar's code would have compiled and worked correctly.
> 
> Is it misleading for the context pointer to be const(void)*? In a way, 
> maybe. However, it's opaquely typed, and its constness says nothing 
> about what's on the other end. Also, the language completely disregards 
> the constness in any case:
> 
> unittest {
>      int i = 0;
>      struct S {
>          int n;
>          void fun() const {
>              i++;
>          }
>      }
>      const S s;
>      assert(i == 0);
>      s.fun();
>      assert(i == 1);
> }

That, I would consider a bug. If it's not, then definitely, you should 
be able to implicitly cast to/from const.

So a bug report is in order. It should be decided one way or another -- 
either the context pointer is part of the struct type or it isn't.

-Steve


More information about the Digitalmars-d mailing list