Вопрос

Это кажется противоречивым. Почему мы используем & amp; Example :: func вместо Example :: func? есть ли применение для Example :: func или & exampleFunction? не похоже, что мы можем сделать ссылку на функцию, чтобы исключить Example :: func. и я не могу придумать, как использовать & amp; exampleFunction, так как exampleFunction уже возвращает указатель.

#include <iostream>
class Example {
public:
    void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)(); 
typedef void (*ExampleFunction_t)();
int main()
{
    Example e;
    ExampleFunc_t     f  = &Example::func;
    ExampleFunction_t f2 = exampleFunction;
    (e.*f)();
    f2();
    return 0;
} 
Это было полезно?

Решение

Потому что именно так стандарт определяет указатели на функции.

На самом деле вам всегда нужно использовать адресный оператор & amp; , чтобы получить указатель на функцию, но для обычных функций и статических функций-членов неявное преобразование из функции в указатель на функцию имеет вид определено в стандарте.

Это не определено для (нестатической) функции-члена, потому что вы не можете получить lvalue для нестатической функции-члена.

Из стандарта C ++:

  

4.3 Преобразование функции в указатель

     <Ол>   
  • Значение l типа функции T можно преобразовать в значение типа r   & # 8220; указатель на T. & # 8221; Результатом является указатель на функцию.
  •   

    со сноской 52:

      

    Это преобразование никогда не применяется к нестатическим функциям-членам, потому что   lvalue, который ссылается на нестатическую функцию-член, не может быть получен.

    Я думаю, что они скорее позволят & amp; функционировать только по соображениям согласованности, но что неявное преобразование является просто артефактом наследия C ...

    Другие советы

    Дело в том, что используются указатели функций . Для очень грубого примера, предположим, что у вас есть класс, имеющий несколько переменных-членов, по которым вам может понадобиться отсортировать элементы массива этого типа класса, например, так:

    struct CL {
        int x, y, z;
    };
    
    bool sort_by_x(const CL& obj1, const CL& obj2);
    bool sort_by_y(const CL& obj1, const CL& obj2);
    bool sort_by_z(const CL& obj1, const CL& obj2);
    
    ...
    
    CL obj[100];
    ...
    sort(obj, obj+100, sort_by_x);
    ...
    sort(obj, obj+100, sort_by_y);
    ...
    sort(obj, obj+100, sort_by_z);
    

    Здесь std :: sort используется для сортировки массива объектов CL. Посмотрите на третий параметр, это имя функции. Функция std :: sort может взять указатель на функцию в третьем параметре и использовать эту функцию в качестве компаратора для сортировки массива. Это зависит от нас, как определить функции sort_by_ *, чтобы std :: sort работал как положено.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top