Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R-value inserts don't work for unordered_map

Tags:

c++

c++11

tr1

I'm using the latest available GCC build from repository. I decided to use it because some additional C++0x features. However now I stuck with something what supposes to work - I want to add new element to map via r-value. Simplified code, which demonstrates problem:

#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));
}

Notice, that when replace X class with some primitive type like int code compiles and work just fine.

In my production code class corresponding to X doesn't have copy constructor too.

Error message is (like all template-related errors) long and unreadable and I'm not sure if it's good idea to put it here. Notify me if you want error message, so I'll update this question. Last part of message is interesting:

(...)
/usr/include/c++/trunk/ext/new_allocator.h:106:9: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’
In file included from /usr/include/c++/trunk/utility:71:0,
                 from /usr/include/c++/trunk/tr1/unordered_map:34,
                 from kod.cpp:1:
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’ is implicitly deleted because the default definition would be ill-formed:
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: use of deleted function ‘X::X(const X&)’

Moreover this should work, because similar bug was already fixed [C++0x] Implement emplace* in associative and unordered containers.

Maybe I'm doing something wrong? I want to be sure, that's GCC or libstdc++ bug before reporting it.

like image 645
Goofy Avatar asked Jan 26 '11 20:01

Goofy


1 Answers

Your code looks correct to me except for your use of tr1. tr1-qualified stuff doesn't know about rvalue reference or move semantics.

I took your code, removed tr1 from the header and namespace qualifiers, and successfully compiled your code using g++-4.4 and libc++ (http://libcxx.llvm.org/). Try removing tr1.

like image 119
Howard Hinnant Avatar answered Sep 28 '22 18:09

Howard Hinnant