Почему при коннекте сигнала-слота обязатеьно нужно писать &Class::Slot?
Вообще, конечно, с амперсандом очевиднее, что берётся указатель на функцию. Но! Ведь это вовсе не обязательно. На сколько я помню в Си:
function == &function
(*ptr2func)() == ptr2func()
Так почему тогда при коннекте сигнала со слотом (без &) выводит ошибку?
error: reference to non-static member function must be called
Ответы (1 шт):
Правила C++ разрешают преобразование (в т.ч. неявное) функции в указатель на функцию, однако, подобное преобразование не статических функций-членов в указатели на функции-члены не разрешено.
Поэтому для получения адреса не статической функции-члена необходимо явно "запрашивать" адрес с помощью унарного оператора &.
Также стоит учитывать, что оператор & требует квалифицированного имени не статической функции-члена. Пример:
struct some
{
void foo();
void bar()
{
&foo;//ошибка - foo не квалифицированный идентификатор (unqualified-id)
&some::foo;//ок - some::foo - квалифицированный идентификатор (qualified-id)
}
};