The bizarre world of typeof()
grauzone
none at example.net
Mon Oct 26 06:47:14 PDT 2009
Lars T. Kyllingstad wrote:
> Kagamin wrote:
>> Lars T. Kyllingstad Wrote:
>>
>>> // This one fails with the following hilarious message:
>>> // Error: static assert (is(real function() == function)) is false
>>> static assert (is (typeof(&Foo.bar) == function));
>>
>> Failure is valid, compiler just can't show member function types
>> correctly.
>
>
> I'm not saying it should compile, I'm saying that the compiler should
> give an error when it encounters the expression &Foo.bar, and not just
> because of the failed assertion. It's bad enough that it accepts Foo.bar
> (this is what Don was talking about), but allowing one to take the
> address as well is just nonsense -- even when it's in an is(typeof())
> expression.
>
> In fact, &Foo.bar actually returns an address. The following compiles:
>
> class Foo { real bar() { return 1.0; } }
> auto f = &Foo.bar;
> auto x = f();
>
> Of course, when run, it segfaults on the last line. I wonder where f
> actually points to.
We need that to get the address of a function. It's just that the type
of the returned object is a bit bogus: it's not really a function; it's
a method pointer casted to a function pointer. It simply has the wrong
calling convention.
We also need typeof(&Foo.bar) to get the parameter and return types for
the bar method.
> -Lars
More information about the Digitalmars-d
mailing list