Почему компилятор MSV C жалуется на этот простой код, когда я помещаю обратно в вектор объект, содержащий std :: map или std :: unordered_map, но не когда он содержит std :: vector? Даже если произойдет некоторый рост, он все равно должен просто перемещать элементы в новое место, когда это возможно, верно?
На самом деле я только что проверил код с помощью компиляторов G CC и Clang, они построили его без проблем. Это просто проблема с MSV C?
#include <vector>
#include <map>
#include <unordered_map>
struct NonCopyable
{
NonCopyable() = default;
NonCopyable(const NonCopyable& o) = delete;
NonCopyable& operator=(const NonCopyable& o) = delete;
NonCopyable(NonCopyable&& o) noexcept = default;
NonCopyable& operator=(NonCopyable&& o) noexcept = default;
std::unordered_map<int, int> map; // MSVC tries to call a deleted copy constructor
// std::map<int, int> map; // MSVC tries to call a deleted copy constructor
// std::vector<int> map; // OK
};
int main()
{
std::vector<NonCopyable> collection;
collection.emplace_back();
}