2012-02-03 9 views
5

Tôi đã tạo một bản đồ không thể sao chép mà tôi không thể biên dịch bằng tiếng kêu. Kể từ khi kêu vang có nghĩa là rất tuân thủ các tiêu chuẩn tôi đã tự hỏi nếu mã của tôi là hợp pháp. MSVS 2010 và GCC 4.7 biên dịch mã này mà không có cảnh báo hoặc lỗi.Bản đồ này có thể sao chép hợp pháp C++ 11 không? GCC 4.7 và MSVS 2010 cho phép nó. Clang 3.1 không

Mã đầy đủ được đính kèm: dòng có vấn đề là dòng cuối cùng của main.

= delete nhu cầu loại bỏ cho MSVS 2010

#include <utility> 
#include <iostream> 
#include <map> 

template<typename Key_t, typename Value_t, typename Compare_t = std::less<Key_t> > 
class non_copyable_map : public std::map<Key_t,Value_t,Compare_t> 
{ 
    typedef std::map<Key_t,Value_t,Compare_t> BaseType; 

    public: 
    non_copyable_map() { } 

    non_copyable_map(non_copyable_map&& t) : BaseType(std::move(t)) {} 

    non_copyable_map& operator = (non_copyable_map&& t) 
    { 
     if (this != &t) 
     { 
     std::swap<BaseType>(*this,t); 
     } 
     return *this; 
    } 

    private: 
    non_copyable_map(const non_copyable_map&) = delete; 
    non_copyable_map& operator = (const non_copyable_map&) = delete; 
}; 

int main(int argc, char* argv[]) 
{ 
    non_copyable_map<int, non_copyable_map<int, int> > nestedMap; 
    non_copyable_map<int,int> inner; 
    inner[3]=4; 
    nestedMap[2] = std::move(inner); // THIS LINE CAUSES CLANG PROBLEMS 
} 

Thông báo lỗi khi sử dụng clang++-mp-3.1 -std=c++0x -stdlib=libc++ MapOfMaps.cpp là:

In file included from MapOfMaps.cpp:2: 
In file included from /usr/include/c++/v1/iostream:40: 
In file included from /usr/include/c++/v1/istream:156: 
In file included from /usr/include/c++/v1/ostream:134: 
In file included from /usr/include/c++/v1/bitset:118: 
/usr/include/c++/v1/__bit_reference:26:26: error: no type named '__storage_type' in 
     'std::__1::map<int, int, std::__1::less<int>, std::__1::allocator<std::__1::pair<const 
     int, int> > >' 
    typedef typename _C::__storage_type __storage_type; 
      ~~~~~~~~~~~~~^~~~~~~~~~~~~~ 
MapOfMaps.cpp:21:25: note: in instantiation of template class 
     'std::__1::__bit_reference<std::__1::map<int, int, std::__1::less<int>, 
     std::__1::allocator<std::__1::pair<const int, int> > > >' requested here 
           std::swap<BaseType>(*this,t); 
                ^
MapOfMaps.cpp:36:15: note: in instantiation of member function 'non_copyable_map<int, int, 
     std::__1::less<int> >::operator=' requested here 
     nestedMap[2] = std::move(inner); 
        ^
In file included from MapOfMaps.cpp:2: 
In file included from /usr/include/c++/v1/iostream:40: 
In file included from /usr/include/c++/v1/istream:156: 
In file included from /usr/include/c++/v1/ostream:134: 
In file included from /usr/include/c++/v1/bitset:118: 
/usr/include/c++/v1/__bit_reference:27:26: error: no type named '__storage_pointer' in 
     'std::__1::map<int, int, std::__1::less<int>, std::__1::allocator<std::__1::pair<const 
     int, int> > >' 
    typedef typename _C::__storage_pointer __storage_pointer; 
      ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ 
/usr/include/c++/v1/__bit_reference:33:25: error: no type named '__self' in 
     'std::__1::map<int, int, std::__1::less<int>, std::__1::allocator<std::__1::pair<const 
     int, int> > >' 
    friend typename _C::__self; 
      ~~~~~~~~~~~~~^~~~~~ 
In file included from MapOfMaps.cpp:3: 
In file included from /usr/include/c++/v1/map:338: 
/usr/include/c++/v1/__tree:1291:14: error: overload resolution selected deleted operator '=' 
    __pair3_ = _STD::move(__t.__pair3_); 
    ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/include/c++/v1/__tree:1308:9: note: in instantiation of member function 
     'std::__1::__tree<std::__1::pair<int, int>, std::__1::__map_value_compare<int, int, 
     std::__1::less<int>, true>, std::__1::allocator<std::__1::pair<int, int> > 
     >::__move_assign' requested here 
     __move_assign(__t, true_type()); 
     ^
/usr/include/c++/v1/__tree:1353:5: note: in instantiation of member function 
     'std::__1::__tree<std::__1::pair<int, int>, std::__1::__map_value_compare<int, int, 
     std::__1::less<int>, true>, std::__1::allocator<std::__1::pair<int, int> > 
     >::__move_assign' requested here 
    __move_assign(__t, integral_constant<bool, 
    ^
/usr/include/c++/v1/map:736:21: note: in instantiation of member function 
     'std::__1::__tree<std::__1::pair<int, int>, std::__1::__map_value_compare<int, int, 
     std::__1::less<int>, true>, std::__1::allocator<std::__1::pair<int, int> > >::operator=' 
     requested here 
      __tree_ = _STD::move(__m.__tree_); 
        ^
/usr/include/c++/v1/type_traits:2342:9: note: in instantiation of member function 
     'std::__1::map<int, int, std::__1::less<int>, std::__1::allocator<std::__1::pair<const 
     int, int> > >::operator=' requested here 
    __x = _STD::move(__y); 
     ^
MapOfMaps.cpp:21:5: note: in instantiation of function template specialization 
     'std::__1::swap<std::__1::map<int, int, std::__1::less<int>, 
     std::__1::allocator<std::__1::pair<const int, int> > > >' requested here 
           std::swap<BaseType>(*this,t); 
           ^
MapOfMaps.cpp:36:15: note: in instantiation of member function 'non_copyable_map<int, int, 
     std::__1::less<int> >::operator=' requested here 
     nestedMap[2] = std::move(inner); 
        ^
/usr/include/c++/v1/memory:1918:7: note: candidate function (the implicit copy assignment 
     operator) has been explicitly deleted 
class __compressed_pair 
    ^
4 errors generated. 
+0

Bạn nhận được thông báo lỗi cụ thể nào? – templatetypedef

+0

Tôi đã thêm lỗi vào cuối bài đăng đầu tiên – jbcoe

Trả lời

1

Đây có thể là kêu vang hoặc libC++ lỗi (hầu như libC++). Tôi không nhân đôi triệu chứng của bạn bằng các công cụ tip-of-trunk. Các tiêu đề libC++ mới nhất là here. Đây là một chút một shot trong bóng tối của, nhưng cố gắng này:

swap(static_cast<BaseType&>(*this),static_cast<BaseType&>(t)); 

Có vẻ như bạn đang bị rối lên với điều này swap trong <__bit_reference>:

template <class _Cp, class _Dp> 
_LIBCPP_INLINE_VISIBILITY inline 
void 
swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT 

mà không có gì để làm với bản đồ. Nó chỉ xảy ra trong phạm vi.

+0

Điều đó đã khắc phục được sự cố. Cảm ơn. Bất kỳ ý tưởng nào gây ra sự lộn xộn với 'hoán đổi' trong' <__ bit_reference> '? – jbcoe

+0

Tôi đã làm một chút gameunking (rất ít, một vài phút) và chạy qua này: http://llvm.org/bugs/show_bug.cgi?id=10248 Nó trông rất giống với trường hợp của bạn, và ở đó tôi lập luận rằng mã của bạn không phù hợp, hoặc phải là (tôi nghĩ vì gọi nó với một tham số mẫu rõ ràng). Để nói cho bạn biết sự thật là đã 7 tháng kể từ khi tôi viết điều đó, và tôi không thể nhớ lại chi tiết buổi tối hôm nay (bộ não của tôi được tham gia ở nơi khác). Tuy nhiên tôi đã kiểm tra trong một biện pháp ngăn chặn khoảng cách để bảo vệ trao đổi trên __bit_reference tại thời điểm đó, và dường như là những gì đang bảo vệ mã tip-of-trunk. –