C++ 为每个lambda函数使用std::for_时出错
我有一个小问题,我不明白为什么这个代码不起作用:C++ 为每个lambda函数使用std::for_时出错,c++,boost,c++11,wt,C++,Boost,C++11,Wt,我有一个小问题,我不明白为什么这个代码不起作用: std::for_each(users.begin(), users.end(), [](Wt::WString u) { std::cout << "ilosc: " << users.size() << std::endl; userBox_->addItem(u); }); 谢谢你的回答,我很好奇这是为什么。捕获变量用户意味着将lambda声明为: [users](Wt::
std::for_each(users.begin(), users.end(), [](Wt::WString u)
{
std::cout << "ilosc: " << users.size() << std::endl;
userBox_->addItem(u);
});
谢谢你的回答,我很好奇这是为什么。捕获变量用户意味着将lambda声明为:
[users](Wt::WString u){...}
[&users](Wt::WString u){...}
它将作为只读变量传递用户
为了能够修改用户
,您需要将lambda声明为:
[users](Wt::WString u){...}
[&users](Wt::WString u){...}
您编写的lambda不捕获任何上下文变量。为此,最简单的方法是将
&
添加到lambda的捕获列表中。这将通过引用捕获所有上下文变量,您将能够在lambda中访问它们
std::for_each(users.begin(), users.end(), [&](Wt::WString u)
{
std::cout << "ilosc: " << users.size() << std::endl;
userBox_->addItem(u);
});
MSDN有一篇很好的文章详细地解释了这个问题
最后,在您的例子中,不需要为每个和一个lambda设置std::for_。使用基于范围的for
循环将项目添加到集合中会更加简洁
for( auto const& u: users ) {
userBox_->addItem(u);
}
你需要知道的一切都在你收到的错误中
您明确地告诉lambda不要使用“[]”捕获任何内容,这意味着它在函数体中可以访问的唯一变量是参数和全局变量
无论userBox_uuu是什么类型,它都是一个成员变量,因此lambda需要捕获“this”
最后,您将通过值进行传递,这意味着您将复制每个Wt::WString。您可能希望使用
std::for_each(users.begin(), users.end(), [&](const Wt::WString& u) {
...
});
“&”通过引用捕获,并将为您捕获“this”
您是否尝试过[&](Wt::WString u){…}
?并像错误告诉您的那样使用-std=c++11
进行编译?除了上面的注释之外,您可能还打算使用u.size()代码>也。@chris:[默认启用]
似乎表明此警告不是问题所在?@paxdiablo,这意味着该警告是默认启用的,至少从我的经验来看是这样。GCC警告的某些部分可能有点误导。感谢asnwer!缺少&和c11标志有助于正确生成代码。正如您编写的users.size()在本例中没有意义,这是我的错误。