带有libc的Clang 3.8.1编译以下程序:
- #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;
- }
但是使用libstdc的gcc 6.1.0却没有.第一行gcc错误是:
- error: no matching function for call to 'crbegin(const boost::iterator_range<__gnu_cxx::__normal_iterator<const int*,std::vector<int> > >&
谁是对的?
注意:Boost版本1.61
解决方法
这是一个
bug in libc++; std :: crbegin委托给rbegin,但是通过调用它不合格它正在拿起
boost::rbegin
(
documentation):
- template <class _Cp>
- inline _LIBCPP_INLINE_VISIBILITY
- auto crbegin(const _Cp& __c) -> decltype(rbegin(__c))
- {
- return rbegin(__c);
- // ^-- unqualified,allows ADL
- }
这与[iterator.range]相反,后者表示crbegin只应委托给std :: rbegin:
template <class C> constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c));
14 – Returns:
std::rbegin(c)
.
Libc的cbegin,cend和crend的实现也有同样的bug.