c++ - C++11 中的函数签名差异

标签 c++ lambda c++11 g++ capture

使用以下代码考虑 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/

相关文章:

c++ - 当我已经知道类型名称时嵌套模板参数

c++ - 友商混淆

C# 如何将 Expression<Func<SomeType>> 转换为 Expression<Func<OtherType>>

c++ - std::is_const 将 const 指针标识为非常量

c++ - UnitTest++创建cmd窗口,无法关闭

c++ - 如何使用 IGlobalInterfaceTable 传递接口(interface)指针?

c# - 这个 C# 语法的 VB 等价物是什么,处理委托(delegate)?

c++ - 非本地 lambda 和捕获变量 - "block scope"是什么意思

c++11 - 将数据保存在.exe文件中

c++ - 没有来自 'const std::__1::basic_string<char> to ' std::__1::basic_string<char> *' 的可行转换