стандартная функциональная оболочка функции-члена const

#c #member-function-pointers

#c #указатель на член

Вопрос:

 #include <functional>
#include <iostream>

struct Foo {
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_ i << 'n'; }
    int get_num(int i) { return num_;}
    void set_num(int i) { num_ = i;}
    int num_;
};
int main() {
    std::function<int(const Foo *, int)> f_get_num;
    f_get_num = amp;Foo::get_num;
    return 0;
}
  

Это приведет к появлению ошибки error: invalid conversion from ‘const Foo*’ to ‘Foo*’ [-fpermissive] в строке f_get_num = amp;Foo::get_num . Foo::get_num тип есть int (Foo:: *fp)(int) . Кто-нибудь может это объяснить? Спасибо.

Комментарии:

1. Как вы думаете, почему у get_num нее есть подпись int(const Foo *, int) ?

Ответ №1:

Вы не можете вызывать не const функции для const объектов. Вы можете перейти const Foo* к f_get_num , но Foo::get_num принимает неконстантный неявный this .

Следующие два вызова столь же незаконны:

 Foo foo;
Foo const* const_ptr = amp;foo;

const_ptr->get_num(42);
f_get_num(const_ptr, 42); // results in const_ptr->get_num(42)
  

Вы можете объявить, что ваш get_num const :

 int get_num(int i) const { return num_;}
  

И тогда ваш код будет работать правильно.

Другой способ — сделать ваш f_get_num take непараметрическим const , но это не тот путь, когда ваша функция является получателем и не должна изменять объект.

 std::function<int(Foo*, int)> f_get_num;
f_get_num = amp;Foo::get_num;