Почему при коннекте сигнала-слота обязатеьно нужно писать &Class::Slot?

Вообще, конечно, с амперсандом очевиднее, что берётся указатель на функцию. Но! Ведь это вовсе не обязательно. На сколько я помню в Си:

     function == &function
(*ptr2func)() == ptr2func()

Так почему тогда при коннекте сигнала со слотом (без &) выводит ошибку?

error: reference to non-static member function must be called


Ответы (1 шт):

Автор решения: Croessmah

Правила C++ разрешают преобразование (в т.ч. неявное) функции в указатель на функцию, однако, подобное преобразование не статических функций-членов в указатели на функции-члены не разрешено.

Поэтому для получения адреса не статической функции-члена необходимо явно "запрашивать" адрес с помощью унарного оператора &.

Также стоит учитывать, что оператор & требует квалифицированного имени не статической функции-члена. Пример:

struct some
{
    void foo();
    void bar()
    {
        &foo;//ошибка - foo не квалифицированный идентификатор (unqualified-id)
        &some::foo;//ок - some::foo - квалифицированный идентификатор (qualified-id)
    }
};
→ Ссылка