为什么在尝试使用向量或映射以将函数指针列表保留为lambda时出现编译错误

时间:2018-12-12 23:09:39

标签: c++ templates lambda compilation capture

我正在尝试创建函数指针列表,并且这些函数作为lambda传递。

    string msg = "hello";
    vector<string (*)() > myvector;
    auto f = [=]() -> string {return msg; };
    myvector.push_back(f);
    cout << (*myvector[0])();

但是,当尝试捕获变量时,我在编译时出错,而当我什么都不捕获时,它成功了。 当我使用地图,配对或其他类似物品时,会发生此问题。

funtionPointer.cc:36:22: error: no matching function for call to ‘std::vector<std::__cxx11::basic_string<char> (*)()>::push_back(main()::<lambda()>&)’
  myvector.push_back(f);

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

C ++区分了函数指针的类型和具有捕获列表的lambda的类型。您编写的lambda可以作为函数调用,但其类型不是“指向不带参数并返回void的函数的指针”。更具体地说,该lambda表达式的类型将是一些匿名对象类型。

如果要存储可以作为不带任何参数并返回字符串的函数调用的对象的列表,请考虑使向量std::function<string()>可以存储更广泛的可调用类型,例如功能。

如果执行此操作,则要调用这些函数,请使用语法

cout << myvector[0]() << endl;

而不是

cout << *(myvector[0])() << endl;

,因为您不再存储函数指针。 (有趣的事实-您实际上不必取消引用函数指针即可调用它们!)