From: Steven Watanabe (steven_at_[hidden])
Date: 2006-12-28 12:51:19


AMDG

Slawomir Lisznianski wrote:
>
> Given these two type declarations:
>
> typedef boost::function1<void, int &> signature;
>
> typedef void (*fp)(int &);
>
> and these two function definitions:
>
> void not_match(int v) { } // arg by value
>
> void match(int & v) { } // arg by ref
>
> The following seems to be true on my compiler (GCC 4.0.2):
>
> Case 1) signature fn = match; // compiles
>
> Case 2) signature fn = not_match; // compiles (problematic)
>
> Case 3) fp fn = match; // compiles
>
> Case 4) fp fn = not_match; // fails
>
>
> My question is, shouldn't Boost.Function library fail in case 2 with the
> error along the lines of case 4's: "error: invalid conversion from ?void
> (*)(int)? to ?void (*)(int&)?"?
>
> I noticed this problem when users of my library register callbacks but
> occasionally mistype their function signature. They end up modifying
> function-local, rather than "out", variables.
This behavior is intended.
http://www.boost.org/doc/html/function/reference.html#function.definitions

This particular mistake could be made to cause an error by
changing the definition of compatibility to:

/ // if ResultType is not *void*/
  ResultType foo(Arg1 arg1, Arg2 arg2, ..., Arg/N/ arg/N/)
  {
    *return* f((Arg1)arg1, (Arg2)arg2, ..., (ArgN)arg/N/);
  }

  /// if ResultType is *void*/
  ResultType foo(Arg1 arg1, Arg2 arg2, ..., Arg/N/ arg/N/)
  {
    f((Arg1)arg1, (Arg2)arg2, ..., (ArgN)arg/N/);
  }

concept_check can be used to avoid actually making copies at runtime.

In Christ,
Steven Watanabe