为什么boost :: equals要求范围可以复制?

vol*_*evo 7 c++ algorithm boost equals range

不能为我的生活理解为什么这会失败:

#include <vector>

#include "boost/algorithm/string/predicate.hpp"

struct Test
:
    public std::vector<int>
{
    Test() { }
    Test(const Test&) { assert(false); }
};

int main()
{
    Test a;
    Test b;
    boost::algorithm::equals(a, b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ g++ boostEqualsCopyDemo.cpp -I /usr/include/boost-1_47
$ a.out
a.out: boostEqualsCopyDemo.cpp:10: Test::Test(const Test&): Assertion `false' failed.
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

我已经尝试过挖掘增强代码,但这让我头晕目眩.这似乎很荒谬; 如此浪费和不必要.这是怎么回事?

Mic*_*urr 10

Boost试图为你传入的容器制作一组范围,并最终调用range_detail::is_char_ptr(),这是一组函数模板的名称,它使用模板参数推导来确定参数是否是某种char指针(你可能会猜到这个名字).

不幸的是,0匹配非char-pointer参数时返回的'catch-all'函数模板按值获取其参数.

我认为这可以通过更改参数来修复const&.在文件中boost/range/as_literal.hpp查找:

    template< class T >
    inline long is_char_ptr( T /* r */ )
    {
        return 0L;
    }
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

    template< class T >
    inline long is_char_ptr( T const& /* r */ )  // <-- add const&
    {
        return 0L;
    }
Run Code Online (Sandbox Code Playgroud)

我绝不是复杂模板库实现方面的专家(我使用'em,我不写'em),所以我没有声称这种改变不会引起其他一些令人讨厌的副作用.

  • 有关此问题的错误报告,请参阅https://svn.boost.org/trac/boost/ticket/6149. (4认同)