为何VC10的lambda[](&)函数用于map容器会引起拷贝?该怎么解决

为何VC10的lambda[](&)函数用于map容器会引起拷贝?
我知道,在lambda函数中,如果()里面加上&就是引用迭代变量,不会引起变量拷贝,如下:
C/C++ code

struct s{
    int a,b;
    s():a(1),b(2){cout<<"ctor"<<endl;}
    s(const s& ss){a=ss.a;b=ss.b;cout<<"copy ctor"<<endl;}
    s& operator=(const s& ss){a=ss.a;b=ss.b;cout<<"operator="<<endl;return *this;}
};

void main(void){
    vector<s> ms;
    ms.push_back(s());
    ms.push_back(s());

    cout<<"========================================\n";
    for_each(ms.begin(),ms.end(),[](s& p){cout<<p.a<<p.b<<'\n';});
    cout<<"========================================\n";
    for(auto it=ms.begin();it!=ms.end();++it){
        cout<<it->a<<it->b<<'\n';
    }
}


上面这段代码打印输出:
ctor
copy ctor
ctor
copy ctor
copy ctor
========================================
12
12
========================================
12
12

到此为止都没有问题,如果我的lambda函数写成了: [](s p){cout<<p.a<<p.b<<'\n';});就会引起拷贝,运行输出:
ctor
copy ctor
ctor
copy ctor
copy ctor
========================================
copy ctor
12
copy ctor
12
========================================
12
12

但是我发现,如果我不用vector而是用map的话,即使lambda函数的()里面用了&,还是会引起对象拷贝,这是为什么呢? 如下代码:
C/C++ code

struct s{
    int a,b;
    s():a(1),b(2){cout<<"ctor"<<endl;}
    s(const s& ss){a=ss.a;b=ss.b;cout<<"copy ctor"<<endl;}
    s& operator=(const s& ss){a=ss.a;b=ss.b;cout<<"operator="<<endl;return *this;}
};
void main(void){
    map<int,s> ms;
    ms.insert(make_pair(1,s()));
    ms.insert(make_pair(2,s()));

    cout<<"========================================\n";
    for_each(ms.begin(),ms.end(),[](const pair<int,s>& p){cout<<p.second.a<<p.second.b<<'\n';});
    cout<<"========================================\n";
    for(auto it=ms.begin();it!=ms.end();++it){
        cout<<it->second.a<<it->second.b<<'\n';
    }
}



打印输出:
ctor
copy ctor
copy ctor
ctor
copy ctor
copy ctor
========================================
copy ctor
12
copy ctor
12
========================================
12
12
很显然,for_each函数里面的pair被拷贝了。这是为什么呢?


------解决方案--------------------
必须有一个copy
map<int, s>::value_type 猜猜这是什么?
答对了。是pair<const int, s>,map的key就是const的
------解决方案--------------------
C/C++ code

template<typename T1, typename T2>
struct pair
{
    //..............
    template<typename Other1, typename Other2>
    pair(const pair<Other1, Other2>& s);   //pair<const int, s> p = pair<int, s>();
};