2016-08-10 19 views
6

Clang 3.8.1 với libC++ biên dịch chương trình sau đây:Clang vs gcc std :: crbegin với boost :: iterator_range

#include <vector> 
#include <iterator> 
#include <algorithm> 
#include <iostream> 

#include <boost/range/iterator_range.hpp> 

int main() 
{ 
    const std::vector<int> v {1, 2, 3}; 

    const auto range = boost::make_iterator_range(v); 

    std::copy(std::crbegin(range), std::crend(range), std::ostream_iterator<int> {std::cout, " "}); 
    std::cout << std::endl; 

    return 0; 
} 

Nhưng gcc 6.1.0 với libstdC++ thì không. Dòng đầu tiên của lỗi gcc là:

error: no matching function for call to 'crbegin(const boost::iterator_range<__gnu_cxx::__normal_iterator<const int*, std::vector<int> > >& 

Ai là đúng?

Note: phiên bản Boost 1,61

+1

Gcc bị lỗi gì? – aschepler

+0

@aschepler Tôi đã thêm dòng đầu tiên của lỗi - phần còn lại không thêm nhiều. Tương tự cho 'std :: crend'. Tôi thực sự nghĩ gcc là đúng ở đây - không có phương thức thành viên 'rbegin' hoặc' rend' trong 'boost :: iterator_range'. Tôi không hiểu Clang đang làm thế nào! – Daniel

+0

@Daniel: Bạn có đang sử dụng Clang với libC++ hoặc libstdC++ không? Nếu trước đây, có lẽ nó gọi 'std :: make_reverse_iterator (range.begin())' nếu không có hàm thành viên 'rbegin' hiện diện. Nếu sau này, thì câu hỏi hay là ... – ildjarn

Trả lời

11

Đó là một bug in libc++; std::crbegin được ủy thác cho rbegin, nhưng bằng cách gọi nó không đủ điều kiện nó nhặt boost::rbegin (documentation):

template <class _Cp> 
inline _LIBCPP_INLINE_VISIBILITY 
auto crbegin(const _Cp& __c) -> decltype(rbegin(__c)) 
{ 
    return rbegin(__c); 
    //  ^-- unqualified, allows ADL 
} 

Đây là trái với [iterator.range], mà nói rằng crbegin nên uỷ thác cho chỉ :

template <class C> constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c));

14 - Returns:std::rbegin(c).

Việc triển khai của LibC++ là cbegin, cendcrend có cùng lỗi.

+2

Cảm ơn báo cáo lỗi. –

+2

Và bây giờ nó đã được sửa. –

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