Boost logo

Boost :

Subject: Re: [boost] [contract] concepts: pseudo-signatures vs. usage patterns
From: Dave Abrahams (dave_at_[hidden])
Date: 2012-10-11 16:52:49


on Thu Oct 11 2012, Andrew Sutton <asutton.list-AT-gmail.com> wrote:

>> Look for example at
>> http://www.sgi.com/tech/stl/find_if.html. I can easily satisfy all the
>> stated requirements and produce an example that won't compile. I can
>> also easily fail to satisfy the stated requirements and produce an
>> example that *will* compile. That's because there's a great deal of
>> potential mischief hiding in expressions such as
>>
>> f(*p)
>
> Can you produce those examples? You've made me curious.

Doesn't compile, but "should"

--8<---------------cut here---------------start------------->8---
  #include <algorithm>
  #include <vector>

  struct Predicate
  {
      typedef char argument_type;

      bool operator()(char) const;
      bool operator()(long) const;
  };

  std::vector<int> v(10);
  std::vector<int>::iterator p = std::find_if(v.begin(), v.end(), Predicate());
--8<---------------cut here---------------end--------------->8---

If you take the standard definition of "input iterator" instead of the
SGI one, the examples are even more compelling, because the result type
of "*p" merely has to be "convertible to T", so it's easy to arrange a
Predicate with no overloads that fails to accept the argument because
too many implicit conversions are required.

For the "shouldn't compile, but does" example I was presuming the
standard definition of "input iterator;" just make an input iterator
that returns a type X convertible to the value type, and make the
predicate's operator() accept X but not the value type.

-- 
Dave Abrahams
BoostPro Computing                  Software Development        Training
http://www.boostpro.com             Clang/LLVM/EDG Compilers  C++  Boost

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk