C++ 为什么映射上的std::for_都调用复制构造函数?

C++ 为什么映射上的std::for_都调用复制构造函数?,c++,c++11,map,lambda,c++14,C++,C++11,Map,Lambda,C++14,我有一个简单的例子,其中我想对不可复制的对象集合调用std::for_each: class A { public: A() : x(0) {} A(const A&) = delete; private: int x; }; void func() { std::vector<A> v(10); std::map<int, A> m; // works as expected std::for_eac

我有一个简单的例子,其中我想对不可复制的对象集合调用
std::for_each

class A {
public:
    A() : x(0) {}
    A(const A&) = delete;

private:
    int x;
};

void func() {
    std::vector<A> v(10);
    std::map<int, A> m;

    // works as expected
    std::for_each(begin(v), end(v), [](const A& a) { /* do nothing */ });

    // error calling copy constructor
    std::for_each(begin(m), end(m), [](const std::pair<int, A>& a) { /* do nothing */ });
}
A类{
公众:
A():x(0){}
A(常数A&)=删除;
私人:
int x;
};
void func(){
std::向量v(10);
std::map m;
//工作如期进行
std::对于每一个(开始(v),结束(v),[](常量A&A){/*什么都不做*/});
//调用复制构造函数时出错
std::for_each(begin(m)、end(m),[](const std::pair&a){/*什么都不做*/});
}

如果我将所有内容放入一个
std::vector
,它会像我预期的那样工作,但是当使用
std::map
时,突然
std::for\u each
想要调用(删除的)复制构造函数。为什么?我会假设我只是得到了一个映射中保存的对的引用,没有任何必要的副本。

问题是
std::map
有一个
std::pair
作为其内部值类型。标准库容器允许您从容器类型中提取,而不是显式指定:

在C++11中,请执行以下操作(与C++98中的操作相同,但必须在
中为每个
使用函数对象而不是lambda,并且还必须使用
typedef
而不是
using=
):


Clang 3.4、Visual Studio 2013 11月CTP和GCC 4.9支持在lambda中使用
auto

C++03中的lambda将推动它:)我想你分别指的是C++11和C++1y。谢谢!我知道
std::map
现在有一个常量键。我只是没有建立连接,我的编译器对它的错误消息没有什么帮助。还要注意,
std::for_each(begin(m)、end(m),[](std::pair a){/*doNothing*/})
应该可以工作:复制键,但引用值。@Yakk true,但对于泛型代码,显式类型更详细,复制+ref更昂贵(例如,如果关键字是
std::string
)是否有人可以将表单键入改为from。@fschoenm在链接的、非常类似的问题中查看答案谢谢,我的问题已经得到了回答。我没有找到其他帖子,因为我搜索了“foru each”而不是“foreach”,搜索引擎也没有显示其他结果。
using value_type = std::map<int, A>::value_type;
std::for_each(begin(m), end(m), [](value_type const& a) { /* do nothing */ });
std::for_each(begin(m), end(m), [](auto const& a) { /* do nothing */ });