C++ &引用;映射/设置迭代器不兼容“;在映射销毁时,依赖于构造函数调用

C++ &引用;映射/设置迭代器不兼容“;在映射销毁时,依赖于构造函数调用,c++,c++11,map,stl,visual-studio-2013,C++,C++11,Map,Stl,Visual Studio 2013,我正在构建测试,在Visual Studio 2013中遇到了此调试断言问题,2013年11月编译器,调试构建,32位: “表达式:映射/设置迭代器不兼容” “标准C++库无效参数”& & 0<P> 离开调用本地对象析构函数的函数作用域时会发生错误 奇怪的是,我可以通过将代码语法更改为我认为应该等效的语法来修复它。更准确地说,这是一个错误的代码: Kinetics kinetics; kinetics.components.emplace_back(Kinetics::Component{ 0,

我正在构建测试,在Visual Studio 2013中遇到了此调试断言问题,2013年11月编译器,调试构建,32位:
“表达式:映射/设置迭代器不兼容”
“标准C++库无效参数”& & 0<P> 离开调用本地对象析构函数的函数作用域时会发生错误

奇怪的是,我可以通过将代码语法更改为我认为应该等效的语法来修复它。更准确地说,这是一个错误的代码:

Kinetics kinetics;
kinetics.components.emplace_back(Kinetics::Component{ 0, Kinetics::Params{}, 1, 1 });
kinetics.components[0].params.push_back(Kinetics::Param{
    "",
    vector<size_t>{ 0, 1 },
    map < size_t, vector<size_t> >{{0, vector<size_t>{ 0 }}},
    vector<size_t>{ 1 } 
});
kinetics.components[0].params.push_back(Kinetics::Param{
    "",
    vector<size_t>{ 0, 1 },
    map < size_t, vector<size_t> >{{0, vector<size_t>{ 1 }}},
    vector<size_t>{ 0 } 
});
动力学;
动力学。组分。侵位返回(动力学::组分{0,动力学::参数{},1,1});
dynamics.components[0].params.push_back(dynamics::Param){
"",
向量{0,1},
map{0,vector{0}},
向量{1}
});
dynamics.components[0].params.push_back(dynamics::Param){
"",
向量{0,1},
map{0,vector{1}},
向量{0}
});
当这正在工作时,请注意,我只将map构造函数调用移出了Param构造函数调用

Kinetics kinetics;
kinetics.components.emplace_back(Kinetics::Component{ 0, Kinetics::Params{}, 1, 1 });
map < size_t, vector<size_t> > requirements = map < size_t, vector<size_t> >{{0, vector<size_t>{ 0 }}};
kinetics.components[0].params.push_back(Kinetics::Param{
    "",
    vector<size_t>{ 0, 1 },
    move(requirements),
    vector<size_t>{ 1 } 
});
requirements = map < size_t, vector<size_t> >{{0, vector<size_t>{ 1 }}};
kinetics.components[0].params.push_back(Kinetics::Param{
    "",
    vector<size_t>{ 0, 1 },
    move(requirements),
    vector<size_t>{ 0 } 
});
动力学;
动力学。组分。侵位返回(动力学::组分{0,动力学::参数{},1,1});
maprequirements=map{{0,vector{0}};
dynamics.components[0].params.push_back(dynamics::Param){
"",
向量{0,1},
移动(要求),
向量{1}
});
要求=映射<大小,向量>{0,向量{1}};
dynamics.components[0].params.push_back(dynamics::Param){
"",
向量{0,1},
移动(要求),
向量{0}
});
在我看来,以上两个应该是等价的——每次我使用初始值设定项列表,它获取右值引用(来自临时引用或来自移动引用),并将它们存储在其中,所以我不知道为什么会出现错误,错误的类型也让我感到困惑

为完整起见,我还添加了动力学对象的定义:

#define NO_COPY(TypeName) \
TypeName() = default;  \
TypeName(TypeName && ) = default;  \
TypeName& operator=(TypeName && ) = default; \
TypeName(const TypeName & ) = delete; \
TypeName& operator=(const TypeName & ) = delete; 

struct Kinetics {
    NO_COPY(Kinetics)

    struct Param {
        string context; ///< String representation of the context.
        vector<size_t> targets; ///< Towards which level this context may regulate.
        map<size_t, vector<size_t>> requirements; ///< vector<size_t> of the source components this param is relevant to, the vector<size_t> are sorted.

        vector<size_t> target_in_subcolor; ///< List of values from different subparametrizations for this specie, share indices between params.
    };
    using Params = vector < Param > ;

    struct Component {
        size_t ID; ///< ID of the component, shared with the model
        Params params; ///< Vector of parameters, sorted lexicographically by the context.
        size_t col_count; ///< Number of subcolors for this specie.
        size_t step_size; ///< In the context of the whole parametrization space, how may changes occur between a subcolor of this specie changes?
    };

    vector<Component> components; ///< Species shared with the model, sorted lexicographically. 
};
#定义无副本(TypeName)\
TypeName()=默认值\
TypeName(TypeName&&)=默认值\
TypeName&operator=(TypeName&&)=默认值\
TypeName(consttypename&)=删除\
TypeName和operator=(consttypename&)=delete;
结构动力学{
无副本(动力学)
结构参数{
字符串上下文;//<上下文的字符串表示形式。
向量目标;///<此上下文可调节的级别。
映射要求;///<与此参数相关的源组件的向量,对向量进行排序。
向量目标_in_subcolor;//<此物种不同子参数的值列表,在参数之间共享索引。
};
使用参数=向量;
结构组件{
组件的大小\u t ID;//
最后是调用堆栈:

tremppi_test.exe!STD::TyeHyconStistaIdultActua>::运算符==(const STD::TyeSyconSythIythult>)>右328行C++ tremppi_test.exe!STD::STORE>:STD::STD::分配器>,0 >::擦除(STD::TreEyStista迭代器> > >第一,STD::TyeSeStista迭代器> >最后一行1512 C++) tremppi_test.exe!STD::StdRe>,STD::少,STD::分配器>,0 >::(2230)C++ tremppi_test.exe!STD::STEDGE>:STD::STD::分配器>,0>::~~树>,STD:::STD::分配器> 0,(1193)C++ tremppi_test.exe!STD::MAP>,STD::少,STD::分配器>::~MAP>,STD:::STD::分配器> >(+)C++ tremppi_test.exe!PrAM::~(PARAM:)C++ tremppi_test.exe!动力学::PARAM::<代码>标量删除析构函数(无符号int)C++ tremppi_test.exe!STD::分配器:销毁(动力学:PARAM * PTR)608线C++ tremppi_test.exe!STD::分配程序:特征:销毁(STD::分配器和动力学,PARAM * PTR)731线C++ tremppi_test.exe!STD::Y-WrAPLOLC::破坏(动力学:PARAM * PTR)879线C++ tremppi_test.exe!STD::销毁范围(动力学:PARAM *第一,动力学:PARAM *最后,STD::Y-WrAPHLO和C++,STD:::No.NealSARARJIPPTRATIORATIORADORADY正式)第82行C++ tremppi_test.exe!STD::破坏DeavyLeo(动力学:PARAM *第一,动力学:PARAM *最后,STD::Y-WrpApLoCalc和)96线C++ tremppi_test.exe!STD::矢::毁灭(动力学:PARAM *第一,动力学:PARAM *最后)1567线C++ tremppi_test.exe!STD::向量::(1628)C++ tremppi_test.exe!STD::向量::~(946)C++ tremppi_test.exe!动力学::组件::C++组件() tremppi_test.exe!动力学::组件::<代码>标量删除析构函数(无符号int)C++ tremppi_test.exe!STD::分配器:破坏(动力学::组件*PPTR)608 C++ tremppi_test.exe!STD::AlpalActusType >::销毁(STD::分配器和动力学,组件:*PTR)731 C++ tremppi_test.exe!STD::YWRAPHLYLCOR> >:破坏(动力学:组件*PPTR)879 C++ tremppi_test.exe!STD::“破坏范围”>(动力学:第一部分,动力学::组件**最后,STD::Y-WrAPHLULCC++>,STD::非NuxARARJPPTIATRATIORATAG TAG正式)第82行C++ tremppi_test.exe!动力学::成分**第一,动力学:成分*Sub,STD::Y-WrAPHeloC>96线C++ tremppi_test.exe!STD::向量>::毁灭(动力学:第一部分,动力学::成分*最后)1567线C++ tremppi_test.exe!STD::向量>::(1628)C++ tremppi_test.exe!STD::向量>:~向量>()946线C++ tremppi_test.exe!动力学::~(c)C++ tremppi_test.exe!颤抖