C ++ Lambda - String params在以下函数调用中不起作用

时间:2016-10-13 16:12:54

标签: c++ lambda

我有一个问题,当我尝试访问一个lambda中的主要参数的字符串时,编译器在我尝试使用该函数调用函数时不会识别它字符串。

这是我的代码:

void removePunctuation(std::vector<std::string> &inTokens,
                   std::vector<std::string> &outTokens) {
std::for_each(inTokens.begin(), inTokens.end(), [outTokens](std::string s) {
    std::string newS = s;
    // newS.erase(std::remove_if(newS.begin(), newS.end(), ispunct));
    outTokens.push_back(newS);});
}

产生以下错误:

a2.cpp:114:19: error: no matching member function for call to 'push_back'
    outTokens.push_back(newS);});

当我尝试调用在其调用中使用lambda的字符串参数的函数时,我在其他函数中也遇到了这种错误。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:5)

默认情况下,lambda参数为passed as read-only,请尝试

[&outTokens](std::string s)

(如果期望修改outTokens参数,也许你想要的。)

答案 1 :(得分:2)

除了您应该通过引用捕获cd $VENV/MyPyramidProject sudo $VENV/bin/pip install -e . 之外,outTokens更适合这种情况:

std::transform

如果按值传递outTokens.resize( inTokens.size() ); std::transform(inTokens.begin(), inTokens.end(), outTokens.begin(), [](std::string s) { s.erase(std::remove_if(s.begin(), s.end(), ispunct)); return s; } ); ,则无需创建另一个副本来修改它,并且std::string的第一个参数应该是const引用。

答案 2 :(得分:1)

您应该通过引用捕获outTokens

void removePunctuation(std::vector<std::string> &inTokens,
                   std::vector<std::string> &outTokens) {
    std::for_each(inTokens.begin(), inTokens.end(), [&outTokens](std::string s)
       {
           std::string newS = s;
           outTokens.push_back(newS);
       });
}

答案 3 :(得分:1)

除非你制作lambda mutable,否则无法修改由副本捕获的变量。

  

mutable - 允许body修改copy复制的参数,并调用它们的非const成员函数

     

除非在lambda表达式中使用了关键字mutable,否则函数调用运算符是const限定的,并且由副本捕获的对象在此operator()内部是不可修改的。

e.g。

[outTokens](std::string s) mutable { ... }

但这意味着您将修改outTokens的副本,这可能不是您的意图。 (修改副本然后返回并没有多大意义。)您可能希望将其更改为通过引用捕获:

[&outTokens](std::string s) { ... }