为什么std :: invoke不能使用指向成员的指针,该成员是带参数的函数对象?像这样:
struct MyClass
{
std::function<void(int)> functor{ [](int arg) { printf("%d\n", arg); } };
};
int main()
{
MyClass mc;
std::invoke(&MyClass::functor, mc, 110);
}
打印: 'std::invoke': no matching overloaded function found.
我在Visual C和g中检查了这个 .
此外, std::is_invocable_v<decltype(&MyClass::functor), MyClass, int>
声称这个仿函数不可调用,这绝对是错误的 . 我错过了什么或者它是标准中的缺陷吗?如果这种行为是正确的,那么std :: invoke及其所有朋友的观点是什么?我的意思是简单的函数对象可以很容易地调用,没有任何设施,但我虽然std :: invoke的主要目的是概括和简化所有callables的工作,包括棘手的,如指向成员的指针 . std :: invoke无法调用一个明确可调用的目标的事实对我来说似乎很奇怪 .
1 回答
问题是
functor
不是函数,而是数据成员 . 因此,&MyClass::functor
不是指向成员函数的指针,而是指向成员数据的指针 . 这种区别意味着您不能将任何其他参数传递给std::invoke
,因为您无法调用数据成员;但是对于某些数据成员,就像你的functor
一样 . 在C 11之前,标准尚不清楚,因此有LWG issue 1520在C 11中合并 .我的意思是你可以将你的例子重写为:
但我不想你想要什么 . Thanks to Barry,这是一个坏主意,如下面的代码所做的那样:
获取
f
会使其与其他数据成员保持一致,但如果f
不带参数,则无法调用f
. 调用f
意味着当您想要获取它们时,您会与其他数据成员不一致 .