In:
foobar(&MyClass::method);
... &
не является "оператором ссылки", но является оператором адреса.Он принимает адрес своего операнда.
Вы действительно все еще «должны» взять адрес свободной функции в коде, например (хотя неявные преобразования доступны):
goobar(freefunction);
Существуют неявные доступные преобразования, которые приводят к тому, что выражение, такое как Foo
, затухает в указателе, но у меня было много трудностей с тем, чтобы заставить GCC принимать такой код без ошибок и предупреждений, в тех случаях, когда у MSVC нет проблем.
Кроме этого, есть два основных различия между свободными функциями и нестатическими функциями-членами:
- Не
static
функции-члены работают с экземпляром класса, иесть указатель this
, который указывает на сам класс. - Синтаксис для создания и вызова через функцию указателя на свободную отличается от синтаксиса для функции указателя на член.
В случае свободной функции синтаксис тривиален (ish):
void foo(); // Function declaration
void(*f)(); // Declaration of pointer-to-function-returning-void-and-taking-no-parameters
Но в случае указателя на функцию-член, synналог намного сложнее:
struct Bar
{
void DoIt()
{
}
void DoThat(int n)
{
n;
}
};
void(Bar::*thatfn)(int); // declares a pointer-to-member-function taking int returning nothing
thatfn = &Bar::DoThat; // initializes pointer to point to DoThat(int)
(bar.*thatfn)(42); // call the function