
On Tue, Jun 3, 2008 at 5:19 PM, Daniel Walker <daniel.j.walker@gmail.com> wrote:
The reason result_of couldn't deduce argument dependent return types for nullary invocations in C++98 is that according to the heuristic only the result_type member is checked for nullary calls, and for non-nullary calls if the result_type is present, result<> is never checked. So, you can't have both.
Thanks Daniel and Tobias for you explanation. Now this point it's clear to me. Here it is another undocumented behaviour of boost::fusion. Did you know that dereferencing a fusion iterator to a mpl sequence causes a duplication of the pointed object? Following the test code: static int cnt = 0; struct Test { Test() { cnt++; } }; using namespace boost::fusion; int main(int, char**) { typedef boost::mpl::vector<Test,Test> Mpl_vec; Mpl_vec mpl_vec; result_of::begin<Mpl_vec>::type iter = begin(mpl_vec); cout << cnt << endl; // prints 0 deref(iter); cout << cnt << endl; // prints 1 *iter; cout << cnt << endl; // prints 2 return 0; } I found this while traversing a sequence with fusion::for_each because code started to create a lot of copies of the sequence elements, indeed the whole sequence is duplicated each time it's traversed with fusion::for_each !! Is this foreseen or it's a bug. Thanks Marco BTW dereferencing an iterator to a fusion sequence does not show this behaviour and does not copy anything.