【发布时间】:2021-10-27 07:35:13
【问题描述】:
struct Foo {
Foo(int num) : num_(num) {}
void print_add(int i) const { std::cout << num_+i << '\n'; }
int num_;
};
int main ()
{
function<void(const Foo*, int)> func = &Foo::print_add;
function<void(const Foo&, int)> func2 = &Foo::print_add;
Foo f(1), f2(2);
func(&f, 2);
func2(f2, 3);
return 0;
}
为什么func和func2都可以正确调用成员函数Foo::print_add?它们具有不同的可调用类型作为模板参数。据我所知,“this”指针作为隐藏参数传递给所有非静态成员函数调用,func2 的可调用类型接收const Foo& 作为与this 指针类型不匹配的参数。为什么上面的代码不会产生编译错误?
【问题讨论】:
-
func 将在内部存储一个 const 指针,func2 将在内部存储一个 const 引用。两者都是有效的,并且引用和指针都是通过获取地址(& 运算符)来初始化的。不过,周围可能有人可以用更好的标准来解释它;)
-
func(&f, 2)类似于(&f)->print_add(2),func2(f2, 3)类似于f2.print_add(3)。 -
我不确定,但
std::function可能会使用std::invoke机制。 -
@Eljay 该标准不强制
std::function使用std::invoke,但std::function上的呼叫操作员规范与std::invoke的规范非常相似,并使用INVOKE,这是标准为 Callable 对象定义的操作。 -
@Eljay
std::function是根据(虚构的)INVOKE表达式定义的,具体化为std::invoke