Passing myself, a struct, as a C callback context

Paul O'Neil via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Mar 30 19:01:22 PDT 2015


On 03/30/2015 11:32 AM, Steven Schveighoffer wrote:
> On 3/30/15 5:12 AM, "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm at gmx.net>"
> wrote:
>>
>> `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

Thanks for the explanation.  This makes a lot of sense - I forgot that
"ref" actually means "special pointer."

Luckily, I don't plan on overriding opCast!

-- 
Paul O'Neil
Github / IRC: todayman


More information about the Digitalmars-d-learn mailing list