C++11 无法在MSVC中编译不可复制对象的映射向量

C++11 无法在MSVC中编译不可复制对象的映射向量,c++11,visual-c++,stl,move-semantics,C++11,Visual C++,Stl,Move Semantics,以下代码(也在中)在gcc、clang和Visual Studio 2013中编译良好,但在最近的MSVC版本中未编译: #include <map> #include <vector> class MoveOnly { public: MoveOnly() {} MoveOnly(const MoveOnly&) = delete; MoveOnly& operator=(const MoveOnly&) = delete;

以下代码(也在中)在gcc、clang和Visual Studio 2013中编译良好,但在最近的MSVC版本中未编译:

#include <map>
#include <vector>

class MoveOnly {
 public:
  MoveOnly() {}
  MoveOnly(const MoveOnly&) = delete;
  MoveOnly& operator=(const MoveOnly&) = delete;
  MoveOnly(MoveOnly&&);
  MoveOnly& operator=(MoveOnly&&);
};

int main() {
    std::vector<std::map<int, MoveOnly>> vecOfMaps;
    std::map<int, MoveOnly> map;
    vecOfMaps.push_back(std::move(map));
}
#包括
#包括
仅限类移动{
公众:
MoveOnly(){}
MoveOnly(const MoveOnly&)=删除;
MoveOnly&运算符=(const MoveOnly&)=删除;
MoveOnly(MoveOnly&&);
MoveOnly&运算符=(MoveOnly&&);
};
int main(){
向量向量映射;
地图;
vecofmap.push_back(std::move(map));
}
godbolt中所有MSVC版本的编译都失败,在v19.22中出现以下错误(摘录):

错误C2280:'std::pair::pair(const std::pair&'):
试图引用已删除的函数
[...]
注意:编译类模板成员函数时
'std::map::map(
常量std::map&)'
MSVC在将不可复制的对象推入std::map时没有问题。将不可复制的对象推入std::vector也可以。但是将不可复制对象的映射推到向量中失败了

为什么不编译


是否有一种变通方法可以应用于MoveOnly类,使此代码在MSVC中编译,而不会丢失不可复制属性?

尝试对调用
push\u back
进行注释,看看它是否编译。是的,
push\u back
是问题所在。如果没有
推回
,它将编译。但我需要将地图推入向量。当调用涉及地图副本的
push_back
时,您可以用
list
替换
vector
,以避免在
vector
内重新分配。或者使用
unique\u ptr
作为向量元素:
std::vector
。您的问题与
noexcept
有关,您可以阅读或。我删除了
push_back
,并将其替换为调用
reserve(8)
,得到了相同的错误。它是在
map
中涉及内存分配的东西的实例化中。
error C2280: 'std::pair<const _Kty,_Ty>::pair(const std::pair<const _Kty,_Ty> &)':
             attempting to reference a deleted function
[...]
note: while compiling class template member function
      'std::map<int,MoveOnly,std::less<int>,std::allocator<std::pair<const _Kty,_Ty>>>::map(
       const std::map<_Kty,_Ty,std::less<int>,std::allocator<std::pair<const _Kty,_Ty>>> &)'