目前我在std::unordered_map<key,List<shared_ptr<t>>>
中有一个自己版本的链表(其中t是某种类型)。我插入这样的东西:
void addTo(const Key &key, t* ptr)
{
if(ptr==nullptr||ptr==NULL){
throw "this is not a real exception that I am using"
}
try
{
this->getList(key).addNew(std::shared_ptr<t>(ptr));
}
catch(std::out_of_range ex)
{
this->addList(key,(std::shared_ptr<t>(ptr));
}
}
但是,我最近注意到,当getList抛出一个out_of_range异常时(如果映射中没有像这样的密钥,它总是这样做)那么ptr会被删除。现在,如果在调用getList之前创建shared_ptr是有意义的,但为什么会出现这种情况呢?
我已经通过简单地分离this-&gt; getList和addNew来修改这个:
const List<shared_ptr<t>> l& = this->getList(key);
l.addNew(etc etc);
当这样写时,指针没有任何反应。
这让我得出结论,首先创建shared_ptr,这意味着c ++首先处理实例化?对我而言,这并没有多大意义。
c ++执行这些语句的顺序的确切规则是什么?为什么不实例化shared_ptr AFTER - &gt; getList(以不同方式执行此操作的原因是什么)?
答案 0 :(得分:4)
std::shared_ptr<t>(ptr)
和getList(key)
之间的执行顺序未在以下位置指定:
this->getList(key).addNew(std::shared_ptr<t>(ptr));
它可能会从一个编译器变为另一个,甚至从一个调用变为另一个。
C ++ 17为评估顺序添加了更多规则;自此版本起,您应该保证预期的评估顺序。