std :: for_each over std :: set,C++ 11

eis*_*baw 7 c++ foreach stl set c++11

迭代向量工作:

std::vector<int> collection = {2, 3, 4, 5435345, 2};
std::for_each(collection.begin(), collection.end(), [](int& i){cout << i << endl;});
Run Code Online (Sandbox Code Playgroud)

但不是一组(编译错误):

std::set<int> collection = {2, 3, 4, 5435345, 2};
std::for_each(collection.begin(), collection.end(), [](int& i){cout << i << endl;});
Run Code Online (Sandbox Code Playgroud)

为什么我不能遍历一个std::setstd::for_each

奖金问题:另外,我想改变int&lambda的论证auto&,为什么不能自动推断?

ild*_*arn 19

std::set<T>::value_typeT const,不是T; 因此,lambda的参数必须是值类型(即复制)或int const&(和技术上,或int const volatile&),而不是int&.即,这工作:

std::set<int> collection{2, 3, 4, 5435345, 2};
std::for_each(
    collection.begin(),
    collection.end(),
    [](int const& i) { std::cout << i << std::endl; }
);
Run Code Online (Sandbox Code Playgroud)

奖金问题:另外,我想改变int&lambda的论证auto&,为什么不能自动推断?

因为标准说它不能; 从历史上看,我认为这是由于lambda和概念之间过于复杂的相互作用(在概念从草案中删除之前).但是,我听说有传言说新的(C++ 11)标准的第一个缺陷报告将完全解决这个问题,所以你可能会在未来一两年内看到对你选择的编译器的支持. 编辑:哦,看,C++ 14现在有多态lambdas ...