使用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委托(delegate)给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应该仅委托(delegate)给std::rbegin:

Libc++的cbegincendcrend的实现具有相同的错误。

关于c++ - Clang vs gcc std::cr开始使用boost::iterator_range,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38878454/

10-12 06:05