On Wednesday, 2 December 2020 at 11:46:26 UTC, Andre Pany wrote:
alias fpt = extern(C) nothrow void function(int a, int b);

Function pointers don't really have parameter names. They are allowed for user habit and documentation purposes, but the compiler mostly* ignores them; they aren't actually part of the formal type.

* I'm pretty sure I've seen some weird cases where it did work but I can't recall right now.

So this alias erases the names before it does anything with them. This is useful, if you did like

extern(C) nothrow void foo(int not_a, int not_b);
fpt thing = &something;

That assignment is still allowed because the names are not considered. Change anything else though and you get a type mismatch.

Moreover, consider reflection on that. Are Parameters!thing `a, b` because of the alias, or `not_a, not_b` because of the function assigned?

Pretty obvious it can't be the latter, because what the variable actually points to is not known at compile time. But then if it was the former that'd be kinda weird because it wouldn't match what you set.

So I think think it is doing the best it can by just not giving the info.


Now btw if you do want the names off `something`, ParameterIdentifierTuple!something would give you the not_a, not_b. Maybe you can use that in your code.

If you pass a thing as an `alias` template parameter, without the & operator, it retains the names.

Reply via email to