使用以下代码考虑 C++11 的 lambda,
template <typename M>
void call(void (*f)(M), M m)
{
f(m);
}
int main()
{
call<int>([](int n) { }, 42); // OK
int r;
call<int>([&](int n) { r = n; }, 42); // KO
}
lambda 之间是否存在签名差异,导致第二个 lambda 与 call
的参数不兼容?
我使用 g++ 4.6.1。
附带问题:如果我写 call([](int n) { }, 42);
,为什么不能推断出参数?
最佳答案
只有无捕获的 lambda 可以隐式转换为函数指针。
无法将捕获变量的 lambda 转换为函数指针,因为它具有需要维护的状态(捕获的变量)并且该状态不能由函数指针表示。
类型 M
无法从函数参数中推断出来,因为需要进行转换才能将 lambda 转换为函数指针。该转换禁止模板参数推导。如果您要使用实际函数调用函数 call
(例如,void f(int)
),参数推导就可以正常工作。
关于c++ - C++11 中的函数签名差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587930/