移动语义,或者编译器在构造时不识别rvalue?

时间:2014-01-20 11:40:56

标签: c++ move

我尝试使用实现hashmap并向其添加移动语义..但由于某些原因,在某些情况下rvalue无法识别,任何人都可以检测到原因吗?并解释一下? 这是插入内容:

inline bool Insert      (Key_t const&   key,
                         Value_t const& val,
                         iterator*      itr = nullptr)      {
    return Insert(value_type(key, val), itr);
}

/** see comments above */
inline bool Insert      (Key_t&&        key,
                         Value_t const& val,
                         iterator*      itr = nullptr)      {
    return Insert(value_type(std::forward<Key_t>(key), val), itr);
}

/** see comments above */
inline bool Insert      (Key_t const&   key,
                         Value_t&&      val,
                         iterator*      itr = nullptr)      {
    return Insert(value_type(key, std::forward<Value_t>(val)), itr);
}

/** see comments above */
inline bool Insert      (Key_t&&        key,
                         Value_t&&      val,
                         iterator*      itr = nullptr)      {
    return Insert(value_type(std::forward<Key_t>(key), std::forward<Value_t>(val)), itr);
}

这是我的测试员:

typedef HashMap_T<std::string, int> D;
D d;
d.Insert("Alon", 1);

现在我预计它会转到Key_t&amp;&amp;和Value_t&amp;&amp;,但由于某种原因它转到了Key_t const&amp; amp;和Value_t&amp;&amp; ...

但是插入中构造的std :: string将被删除,为什么它不被识别为rvalue?

修改 的 当然字符串文字是左值,但我插入字符串...只是让你明白,这确实是去Key_t&amp;&amp;和Value_t&amp;&amp;:

typedef HashMap_T<std::string, int> D;
D d;
d.Insert(std::string("Alon"), 1);

谢谢, 阿龙

0 个答案:

没有答案