On 3/6/18 8:56 AM, Steven Schveighoffer wrote:
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.

There is a third possibility:

It's part of the type AND it's typed as const if it can be (i.e. none of the methods in the struct modify the context data, and any use of the context data implicitly casts from const).

-Steve

Reply via email to