Этот код отклоняется всеми компиляторами, на которых я мог бы его проверить, поэтому я полагаю, что он плохо образуется в соответствии со стандартом.
Код: Выделить всё
struct X {
void f();
};
void (X::*fptr)() & = &X::f; // ERROR
Здесь мы пытаемся отменить указатель квалифицированной функции члена (то есть указатель, который можно призвать либо с помощью указателя LVALUE или RVALUE) на указатель функции, квалифицированного членом (то есть указатель, который может быть вызван только с помощью ссылки LVALUE). Другими словами, здесь мы пытаемся разыграть тип с более слабыми ограничениями на тип с более сильными ограничениями. с потерей noExcept квалификации (которые также были введены в C ++ 11), компилированные данные:
struct X {
void f() noexcept;
};
void (X::*fptr)() = &X::f; // OK
< /code>
Это ограничение было намеренным? Если это было, каковы были причины навязывать их?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... o-a-ref-qu