C++ MSVC编译器尝试调用已删除的副本构造函数,而不是移动映射元素
当我将一个包含std::map或std::unordered_map的对象重新放置到向量中时,MSVC编译器为什么会抱怨这段简单的代码,而当它包含一个std::vector时却不会抱怨?即使发生了一些增长,它仍然应该尽可能地将元素移动到新位置,对吗 事实上,我只是用GCC和Clang编译器检查了代码,他们毫无问题地构建了它。这只是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>
#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选择不移动它。向量是。如果您提供自己的移动构造函数,它将进行编译。此问题的答案适用于此处: