2012-06-20 46 views
8

Có đoạn mã sauClang, std :: shared_ptr và std :: ít/operator <

#include <memory> 

int main() { 
    std::shared_ptr<int> ptr0(new int); 
    std::shared_ptr<int> ptr1(new int); 

    bool result = ptr0 < ptr1; 
} 

tạo ra lỗi sau khi được biên soạn với kêu vang (phiên bản 3.1, LLVM 3.1, Debian GNU/Linux Sid)

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/shared_ptr.h:364:14: error: no matching function for call to object of type 'std::less<_CT>' 
     return std::less<_CT>()(__a.get(), __b.get()); 
      ^~~~~~~~~~~~~~~~ 
foo.cpp:9:21: note: in instantiation of function template specialization 'std::operator<<int, int>' requested here 
     bool result = ptr0 < ptr1; 
         ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/stl_function.h:236:7: note: candidate function not viable: no known conversion from 'int *' to 'int *&&&' for 
     1st argument; 
     operator()(const _Tp& __x, const _Tp& __y) const 
    ^

Soạn mã giống với GCC (phiên bản 4.7.0) không ném bất kỳ thông báo lỗi nào. Có một lý do tại sao nhà điều hành <() không hoạt động cho các con trỏ được chia sẻ trong clang?

+11

Wow, 'int * &&&' ... – kennytm

Trả lời

12

clang ++ và libstdC++ chưa khớp hoàn hảo. Bạn có thể làm một trong các nội dung sau:

  • Đổi thành libC++ (bằng cách sử dụng clang++ -stdlib=libc++ -std=c++11 ...)
  • Áp dụng các bản vá sau để /usr/include/c++/4.7.0/type_traits (như tài liệu trong http://clang.llvm.org/cxx_status.html):

    Index: include/std/type_traits 
    =================================================================== 
    --- include/std/type_traits (revision 185724) 
    +++ include/std/type_traits (working copy) 
    @@ -1746,7 +1746,7 @@ 
    
        template<typename _Tp, typename _Up> 
        struct common_type<_Tp, _Up> 
    - { typedef decltype(true ? declval<_Tp>() : declval<_Up>()) type; }; 
    + { typedef typename decay<decltype(true ? declval<_Tp>() : declval<_Up>())>::type type; }; 
    
        template<typename _Tp, typename _Up, typename... _Vp> 
        struct common_type<_Tp, _Up, _Vp...> 
    

Nếu bạn kiểm tra bits/shared_ptr.h bạn đã tìm thấy một số std::common_type và các nhà phát triển clang tuyên bố rằng it's actually a bug of libstdc++, mặc dù tôi không tin một lỗi libstdC++ một mình sẽ làm cho loại không tồn tại int*&&& xuất hiện.

Các vấn đề liên quan