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