#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());