Компилятор MSV C пытается вызвать удаленный конструктор копии вместо перемещения для элементов карты - PullRequest
2 голосов
/ 30 мая 2020

Почему компилятор 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();
}
...