Method pointers are *function* pointers?? Or delegates??
Steven Schveighoffer
schveiguy at yahoo.com
Tue May 22 11:14:51 PDT 2012
On Fri, 18 May 2012 16:35:38 -0400, Andrei Alexandrescu
<SeeWebsiteForEmail at erdani.org> wrote:
> On 5/18/12 1:59 PM, Steven Schveighoffer wrote:
>> On Fri, 18 May 2012 14:30:46 -0400, Andrei Alexandrescu
>> <SeeWebsiteForEmail at erdani.org> wrote:
>>
>>> On 5/18/12 1:22 PM, Mehrdad wrote:
>>>> My brain just exploded.
>>>> Can someone explain what's going on?
>>>>
>>>> class Test
>>>> {
>>>> public void foo() { }
>>>> }
>>>>
>>>> static assert(is(typeof(&Test.foo) == void function()));
>>>
>>> Looks like a bug. The assert should pass only if foo were static.
>>
>> No, this is not a bug.
>
> It is.
Poor design? Yes. Bug? no. It's behavior is very intentional and has
been discussed several times over the last several years. It's existed
before D2 was even branched, at least since I learned D in 2007.
>> The purpose is so you can get the function pointer portion of a delegate
>> without an instance of the object.
>
> Typing is what it is. The following program is unsound without a cast in
> sight:
>
> class Test
> {
> void foo() { writeln("foo"); }
> }
>
> static assert(is(typeof(&Test.foo) == void function()));
>
> void fun()
> {
> writeln("fun");
> }
>
> void main() {
> alias void function() TFun;
> TFun a = &fun;
> a();
> a = &Test.foo;
> a();
> }
I agree, it's unsound. But so is this:
int *blah = void;
*blah = 5;
It doesn't mean that the language should forbid it, or that the compiler
isn't implemented as designed.
At the *very least*, the address to member function operation should be
illegal in @safe code.
> At best things could be arranged that &Test.foo has type void
> function(Test) or something.
I would suggest that it should be:
function(Test this) with the 'this' being mangled into the name, and
affect the calling convention.
Structs would be function(ref Test this).
And const/shared/immutable decorations should apply properly to the 'this'
parameter.
I'd wholeheartedly support such an improvement. In fact, I'd be willing
to write a DIP on it, if Walter had a chance of approving it. I just
don't know if it would happen...
-Steve
More information about the Digitalmars-d
mailing list