C++ R值插入don';不适用于无序的地图

C++ R值插入don';不适用于无序的地图,c++,c++11,tr1,C++,C++11,Tr1,我正在使用存储库中最新的可用GCC版本。我决定使用它,因为它有一些额外的C++0x特性。然而,现在我坚持使用一些假设有效的东西——我想通过r值向映射添加新元素。简化的代码,演示了问题: #include <tr1/unordered_map> class X { public: X (void) { /* ... */ }; X (const X& x) = delete; X (X&& x) { /*

我正在使用存储库中最新的可用GCC版本。我决定使用它,因为它有一些额外的C++0x特性。然而,现在我坚持使用一些假设有效的东西——我想通过r值向映射添加新元素。简化的代码,演示了问题:

#include <tr1/unordered_map>

class X
{
    public:
        X (void) { /* ... */ };
        X (const X& x) = delete;
        X (X&& x) { /* ... */ };
};

int main (void)
{
    std::tr1::unordered_map<int, X> map;

    // using std::tr1::unordered_map<int, X>::value_type didn't help too
    std::pair<int, X> value (1, X ());

    map.insert (std::move (value));
}
此外,这应该是可行的,因为类似的错误已经修复


也许我做错了什么?在报告之前,我想确定这是GCC或libstdc++错误。

无序映射的
值类型
不是
std::pair
。它是
std::pair
。如果您将该类型用于
可能会更好

decltype(map)::value_type value(1, X());
map.insert(std::move(value));

虽然我不明白为什么你的代码不能按原样工作。

除了使用tr1之外,我觉得你的代码看起来是正确的。tr1限定的东西不知道右值引用或移动语义


我获取了您的代码,从标头和命名空间限定符中删除了tr1,并使用g++-4.4和libc++成功编译了您的代码(http://libcxx.llvm.org/). 尝试删除tr1。

Works,,不久前,当我试图使用tr1的某些功能时,编译器强迫我使用“tr1”名称空间…tr1指的是非规范性技术报告。这意味着其中的任何功能都是可选的——标准并不要求它们。tr1包含许多库组件,这些组件随后被移动到C++0x。有时在从std::tr1移动到std::的过程中,组件会被修改。向无序的_映射添加移动语义就是这种修改的一个例子。tr1早于C++0x。您可能使用的版本具有tr1,但没有C++0x功能。未发布的GCC 4.6.0中现在提供了缺少与R值兼容的“insert”方法。
decltype(map)::value_type value(1, X());
map.insert(std::move(value));