Допустим, мы хотим хранить в качестве значений в unordered_map неперемещаемый тип. Например, вот так:
#include <mutex>
#include <unordered_map>
struct MyStruct {
std::mutex mutex;
int data = 0;
};
void f(std::unordered_map<int, MyStruct> &map, int key) {
map.emplace(key, {});
}
Получаем ошибку компиляции: https://godbolt.org/z/vaTc5rxfP
У std::mutex нет ни конструктора копирования, ни конструктора перемещения. Однако, такие типы допустимо хранить в качестве значений в данном типе контейнера, потому что под капотом происходит динамическое выделение памяти и контейнер гарантирует, что единственная операция инвалидирующая ссылки и указатели на элементы - erase. Значит за всё время жизни элемента его никто никуда не переместит.
Проблема в том, как сделать emplace. Если бы у MyStruct был конструктор с аргументами - всё было бы просто. А у MyStruct нет конструктора, либо можно добавить, но по логике программы имеет смысл лишь конструктор без аргументов. Однако передать пустой список аргументов в emplace я не могу.