Я наткнулся на это, в котором говорится:
Member function pointers are not pointers. Pointers to non-member functions, including static member functions, are pointers.
Приведенная выше цитата, кажется, предполагает, что указатели на нестатическую функцию-член не являются указателями.
Точно так же я читаю здесь:
A member pointer is a different type category from a ordinary pointer.
мой вопрос, что приведенные выше цитаты технически (формально по стандарту) верны? Я имею в виду, что мы используем термин «указатель» на нестатическую функцию-член. Но если они на самом деле не являются указателями, то зачем вообще использовать термин «указатели»? Насколько я понимаю, это связано с тем, что, хотя «указатель на функции-члены» во многом отличается от обычных указателей, они все же похожи на обычные указатели в одном отношении: они указывают на что-то (имеется в виду хранение адресов).
Я также пробовал:
std::cout<<std::is_pointer_v<void(A::*)()><<std::endl;
что дает 0
подтверждение того, что указатель на нестатическую функцию-член не считается указателем.
@康桓瑋 Потому что std::is_pointer_v<void(A::*)()>
дает ложное значение, что это не указатель, но мы все еще используем термин указатель для их описания.
Из cppreference: "Проверяет, является ли T указателем на объект или указателем на функцию (но не указателем на функцию-член/член)"
Я нашел это в стандарте № 8.3.3(3) [dcl.mptr] 1998-09-01: «Тип «указатель на элемент» отличается от типа «указатель». Это все, что у меня есть.
@ user207421 основное соединение №3: "За исключением указателей на статические члены, текст, относящийся к «указателям», не применяется к указателям на члены."
@康桓瑋 Ага. Формулировка, которую я дал, тоже есть в dcl.mptr#5.
Что касается вашего последнего предложения, нет, PMD / PMF не содержат адресов. Они содержат смещения в классе (поэтому указатель на первый элемент в gcc/linux для выбора импликации имеет нулевые биты, как нулевой указатель)
Процитированные утверждения, по-видимому, подтверждаются следующими утверждениями из стандарта.
[ Note: See also [expr.unary] and [expr.mptr.oper]. The type “pointer to member” is distinct from the type “pointer”, that is, a pointer to member is declared only by the pointer to member declarator syntax, and never by the pointer declarator syntax. There is no “reference-to-member” type in C++. — end note ]
И от основное соединение №3:
...Except for pointers to static members, text referring to “pointers” does not apply to pointers to members...
Вот только их разговорная речь, которую нет процитировал из стандарта. Я не понимаю, почему вы беспокоитесь об этом.