On 3/30/15 5:12 AM, "Marc =?UTF-8?B?U2Now7x0eiI=?= <schue...@gmx.net>"
wrote:
On Monday, 30 March 2015 at 02:53:36 UTC, Paul O'Neil wrote:
I'm registering a callback with some C code. The simplified story is
here, but the actual code is on GitHub [1] at the end if you care.
The call looks something like this.
void register(void(*fp)(void*), void* context);
I have a class that holds state for the callback and registers itself:
final class Klass
{
void method()
{
register(callback_function, &this);
}
}
`this` is already a reference. You're taking the address of that
reference. A simple cast should work: `cast(void*) this`.
To build on this further, &this for a class is actually taking a local
stack reference, this is why it's not allowed.
And technically, cast(void*) this is dangerous in the general case
because opCast can be overridden. If you absolutely need to get a
pointer to a class reference, you would need to do this:
auto x = this;
auto p = &x;
For example, for a foolproof implementation of converting a class
reference to void *, you would need to do:
auto x = this;
auto p = *(cast(void **)&x);
I wonder if those who made this change thought of this problem?
-Steve