РЕДАКТИРОВАТЬ: ответ на первый вопрос - использовать 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;
}
Я получаю следующее сообщение с m в последнем цикле for:
ошибка: неверная инициализация ссылки типа 'std :: pair &' из выражения типа 'std :: pair'
и следующее с m2 в этом месте:
ошибка: недопустимая инициализация неконстантной ссылки типа 'std :: pair &' из rvalue типа 'std :: pair'
Это почему?
Дополнительный вопрос: я нахожу очень странным, что когда инициализация m2 не закомментирована, а цикл for остается нетронутым (в нем все еще есть m, а m2 никогда не используется), сообщение об ошибке меняется с
ошибка: неверная инициализация ссылки типа 'std :: pair &' из выражения типа 'std :: pair'
to
ошибка: недопустимая инициализация неконстантной ссылки типа 'std :: pair &' из rvalue типа 'std :: pair'
Мне бы хотелось узнать ваши мысли по этому поводу. Я тестировал этот код с помощью onlinegdb.com
std::pair<const int, int>
иstd::pair<int, int>
. Несвязанные типы. - person StoryTeller - Unslander Monica   schedule 11.07.2018