Can’t for the life of me understand why this fails:
#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;
}
Output:
$ 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)
I’ve tried digging through the boost code but it’s making my head spin. It seems absurd; so wasteful and unnecessary. What’s going on?
Boost is trying to manufacture a set of ranges for the containers you pass in, and it ends up calling
range_detail::is_char_ptr(), which is the name of a set of function templates that uses template parameter deduction to determine if the parameter is acharpointer of some sort or not (as you might guess by the name).Unfortunately, the ‘catch-all’ function template that returns
0when matching non-char-pointer parameters takes its parameter by value.I think this can be fixed by changing the parameter to take a
const&instead. Look in the fileboost/range/as_literal.hppfor:and change it to:
I’m by no means an expert in the implementation of complex template libraries (I use ’em, I don’t write ’em), so I make no claims that this change won’t cause some other nasty side-effect.