Сбой вызова для создания пары с мьютексом в качестве аргумента. Не удается вставить мьютекс на неупорядоченную карту

#c #unordered-map #stdtuple

#c #неупорядоченная карта #stdtuple

Вопрос:

Ниже приведена ошибка

 std::mutex mtx;
            auto t = std::make_pair(std::string("hello"), mtx);
  

Но следующее нет?

 std::mutex mtx;
            auto t = std::make_pair(std::string("hello"), 1);
  

Моя конечная цель — создать создать неупорядоченную карту типа:

std::unordered_map<std::string, std::mutex>

Использование:

mHeartBeatMutexes.insert(std::make_pair(std::string("hello"), mtx));

Но моя среда разработки говорит, что это неправильно, и я не уверен, почему.

Комментарии:

1. Разрешено ли копировать конструктивные элементы?

Ответ №1:

std::mutex не может быть скопирован или перемещен. Когда вы делаете

 std::mutex mtx;
auto t = std::make_pair(std::string("hello"), mtx);
  

и

 mHeartBeatMutexes.insert(std::make_pair(std::string("hello"), mtx));
  

std::make_pair пытается создать копию mtx , поскольку это значение lvalue, и оно не может, потому std::mutex что не может быть скопировано.

В

 std::mutex mtx;
auto t = std::make_pair(std::string("hello"), 1);
  

1 это целочисленный литерал, который материализуется во временное целое число, которое перемещается (копируется на самом деле, поскольку это одно и то же), и все хорошо.

Чтобы поместить мьютекс в std::unordered_map<std::string, std::mutex> , что вам нужно сделать, это использовать функцию emplace для непосредственного создания пары внутри unordered_map , используя std::piecewise_construct перегрузку и std::forward_as_tuple создавая аргументы для каждого члена конструктора пары, например

 std::unordered_map<std::string, std::mutex> foo;
foo.emplace(std::piecewise_construct,
            std::forward_as_tuple("hello"),
            std::forward_as_tuple());