Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为每个lambda函数使用std::for_时出错_C++_Boost_C++11_Wt - Fatal编程技术网

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()在本例中没有意义,这是我的错误。