title: Why does boost::equals require ranges to be copyable?
body: <p>Can't for the life of me understand why this fails:</p>
  
  <pre><code>#include &lt;vector&gt;
  
  #include "boost/algorithm/string/predicate.hpp"
  
  struct Test
  :
      public std::vector&lt;int&gt;
  {
      Test() { }
      Test(const Test&amp;) { assert(false); }
  };
  
  int main()
  {
      Test a;
      Test b;
      boost::algorithm::equals(a, b);
  
      return 0;
  }
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>$ g++ boostEqualsCopyDemo.cpp -I /usr/include/boost-1_47
  $ a.out
  a.out: boostEqualsCopyDemo.cpp:10: Test::Test(const Test&amp;): Assertion `false' failed.
  Aborted (core dumped)
  </code></pre>
  
  <p>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?</p>