Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么boost::equals要求范围是可复制的?_C++_Algorithm_Boost_Range_Equals - Fatal编程技术网

C++ 为什么boost::equals要求范围是可复制的?

C++ 为什么boost::equals要求范围是可复制的?,c++,algorithm,boost,range,equals,C++,Algorithm,Boost,Range,Equals,我一辈子都不明白为什么会失败: #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

我一辈子都不明白为什么会失败:

#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;
}

我试着去挖掘boost代码,但它让我头晕目眩。这似乎很荒谬;如此浪费和不必要。发生了什么?

Boost试图为您传入的容器创建一组范围,结果调用了
范围\u细节::is\u char\u ptr()
,这是一组函数模板的名称,使用模板参数推断来确定参数是否是某种类型的
char
指针(正如你可能猜到的名字)

不幸的是,在匹配非字符指针参数时返回
0
的“catch all”函数模板按值获取其参数

我认为可以通过将参数改为采用
const&
来解决这个问题。查看文件
boost/range/as_literal.hpp

    template< class T >
    inline long is_char_ptr( T /* r */ )
    {
        return 0L;
    }
模板
内联长字符(T/*r*/)
{
返回0升;
}
并将其更改为:

    template< class T >
    inline long is_char_ptr( T const& /* r */ )  // <-- add const&
    {
        return 0L;
    }
模板

内联long is_char_ptr(T const&/*r*/)//有关此问题的错误报告,请参阅。此修复程序现在位于boost主干中,应该是1.50版本的一部分:
    template< class T >
    inline long is_char_ptr( T const& /* r */ )  // <-- add const&
    {
        return 0L;
    }