Параметр foo3
, который равен void(*)()&
, на самом деле является указателем на функцию с квалификатором ref .Это не разрешено стандартом.
Проект стандарта C ++ 17 n4659 гласит:
[dcl.fct] / 6
Тип функции с cv-qualifier-seq или ref-qualifier (включая тип с именем typedef-name) должен отображаться только как :
(6.1) - тип функции для нестатической функции-члена,
(6.2) - тип функции, к которой относится указатель на член,
(6.3) - тип функции верхнего уровня функции typedefобъявление или псевдоним-объявление,
(6.4) - идентификатор типа в аргументе по умолчанию для параметра типа, или
(6.5) - идентификатор типа для аргумента шаблона для параметра типа.
Параметр foo3
не соответствует ни одному из указанных выше критериев.Наиболее близким к тому, что вы пытаетесь сделать, является (6.2).
Таким образом, вы можете иметь это вместо:
void foo(){}
class C {
public:
void foo1() & {}
};
void foo2(void(*)()){};
void foo3(void(C::*)()&){};
int main(){
(void) foo;
foo2(foo);
foo3(&C::foo1);
}
Это компилируется как в GCC, так и в Clang. Демо здесь .