#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;