Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MSVC编译器尝试调用已删除的副本构造函数,而不是移动映射元素_C++_Visual C++_Compiler Errors - Fatal编程技术网

C++ MSVC编译器尝试调用已删除的副本构造函数,而不是移动映射元素

C++ MSVC编译器尝试调用已删除的副本构造函数,而不是移动映射元素,c++,visual-c++,compiler-errors,C++,Visual C++,Compiler Errors,当我将一个包含std::map或std::unordered_map的对象重新放置到向量中时,MSVC编译器为什么会抱怨这段简单的代码,而当它包含一个std::vector时却不会抱怨?即使发生了一些增长,它仍然应该尽可能地将元素移动到新位置,对吗 事实上,我只是用GCC和Clang编译器检查了代码,他们毫无问题地构建了它。这只是MSVC的问题吗 #include <vector> #include <map> #include <unordered_map>

当我将一个包含std::map或std::unordered_map的对象重新放置到向量中时,MSVC编译器为什么会抱怨这段简单的代码,而当它包含一个std::vector时却不会抱怨?即使发生了一些增长,它仍然应该尽可能地将元素移动到新位置,对吗

事实上,我只是用GCC和Clang编译器检查了代码,他们毫无问题地构建了它。这只是MSVC的问题吗

#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();
}
#包括
#包括
#包括
结构不可复制
{
NonCopyable()=默认值;
不可复制(const NonCopyable&o)=删除;
不可复制运算符=(const NonCopyable&o)=删除;
NonCopyable(NonCopyable&&o)noexcept=默认值;
NonCopyable&operator=(NonCopyable&o)noexcept=default;
std::unordered_map;//MSVC尝试调用已删除的副本构造函数
//std::map map;//MSVC尝试调用已删除的副本构造函数
//std::vector map;//确定
};
int main()
{
病媒采集;
集合。放置_back();
}

简单的解释是std::map不可移动,所以MS选择不移动它。向量是。如果您提供自己的移动构造函数,它将进行编译。此问题的答案适用于此处: