const_cast(iterator-> second)安全吗?

时间:2012-05-19 17:11:56

标签: c++

我想知道这段代码是否安全,并且没有任何未定义的行为。

 QueueMap::const_iterator it = m_3playersQueue.find(s->m_GameCode);
 if(it == m_3playersQueue.end())
 {
     std::deque<Session*> stack;
     stack.push_back(s);

     m_3playersQueue[s->m_GameCode] = stack;
     return;
 }

 const_cast<std::deque<Session*>&>(it->second).push_back(s);

 QueueMap is of type std::tr1::unordered_map< uint32, std::deque<Session*> >

3 个答案:

答案 0 :(得分:4)

你的代码与自己相矛盾。只需使用QueueMap::iterator代替QueueMap::const_iterator

你正在做的是明确地将其设为const,然后const_cast离开const ness。为什么要这么麻烦?

答案 1 :(得分:1)

以下表格中的代码可能更容易理解:始终插入和更新:

std::pair<QueueMap::iterator, bool> p =
  m_3playersQueue.insert(std::make_pair(s->m_GameCode, std::deque<Session*>()));

p.first->second.push_back(s);

唯一的低效率是当元素已经存在时,在这种情况下你必须抛弃一个空的deque。但是,小的,短暂的堆分配通常并不昂贵,因此您应该仔细分析以证明更复杂的代码。想想你的继任者需要多长时间来完成和调试你的代码!

答案 2 :(得分:1)

是的,这是安全的。即使const_iteratoriterator不同,地图中的对象也是相同的。只要所有地图内容都被创建为可变std::deque<Session*>个对象,就可以将常量转换为。

当然,你可能违反了constness所要传达的一些不变量,但是任何const_cast孤立的都可以这样做。