提高范围和ADL查找导致歧义调用

时间:2018-10-24 08:38:05

标签: c++ boost

请检查以下简化示例(提升1.68):

#include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/range.hpp>
#include <vector>

void f(std::vector<boost::shared_ptr<int>>& c) {
    using std::advance;
    auto it = c.begin();
    advance(it, 1);
}

此代码无法在gcc-8和clang-6上编译,并出现相同的错误,对advance()的调用不明确。

这两个候选人:

candidate: ‘constexpr void std::advance(_InputIterator&, _Distance)
[with _InputIterator =
__gnu_cxx::__normal_iterator<boost::shared_ptr<int>*, std::vector<boost::shared_ptr<int> > >; _Distance = int]’
     advance(_InputIterator& __i, _Distance __n)
candidate: ‘constexpr void boost::iterators::advance_adl_barrier::advance(InputIterator&, Distance) [with InputIterator =
__gnu_cxx::__normal_iterator<boost::shared_ptr<int>*, std::vector<boost::shared_ptr<int> > >; Distance = int]’
         advance(InputIterator& it, Distance n)

boost :: range引入了第二个候选对象,不幸的是,我不能简单地删除它,因为它已被另一个依赖项(boost :: geometry)所包含。

不合格的调用是由另一个库(range-v3)执行的,它是故意利用ADL进行的

这显然是与ADL相关的问题,但是我想念为什么编译器找到了第二个候选对象,因为没有涉及boost :: range类型。

0 个答案:

没有答案