将从std :: map获取的std :: pair引用传递给接受std :: pair引用的函数

use*_*922 0 c++ stdmap c++11

编辑:第一个问题的答案是使用std :: pair.关于第二个的任何想法(标记为'奖金问题')?

使用以下代码:

#include <map>
#include <vector>

void foo(std::pair<int, int>& p)  // EDIT: it needs to be non-const
{}

int main()
{
    std::pair<int, int> p{1,2};
    foo(p);
    std::vector<std::pair<int, int>> v{{1,2}};
    for (auto& element : v)
    {
        foo(element);  // works fine
    }

    std::map<int, int> m{std::make_pair(1,2)};
    //std::map<int, int> m2{{1,2}};
    for (auto& element : m)  // the problematic loop
    {
        foo(element);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在后者for循环中得到以下消息:

错误:从'std :: pair'类型的表达式初始化'std :: pair&'类型的引用无效

以及m2中的以下内容:

错误:从'std :: pair'类型的右值开始无效初始化'std :: pair&'类型的非const引用

这是为什么?

额外的问题: 我发现非常奇怪的是,当m2的初始化没有被注释掉并且for循环保持不变(其中仍有m并且m2从未使用过)时,错误消息从

错误:从'std :: pair'类型的表达式初始化'std :: pair&'类型的引用无效

错误:从'std :: pair'类型的右值开始无效初始化'std :: pair&'类型的非const引用

我很想知道你对它的看法.我用onlinegdb.com测试了这段代码

Max*_*kin 6

容器生成密钥const(这适用于所有关联容器):

value_type    std::pair<const Key, T>
Run Code Online (Sandbox Code Playgroud)

所以它应该是void foo(std::pair<int const, int>& p).