Thanks Peter Dimov! When I posted the message, the scales fell from my eyes and I realized a even simpler workaround: Simply perform the loop myself and use the explicit version of apply_visitor: Replace the for_each construction for_each( v.begin(), v.end(), compose1(apply_visitor(_dummy), select1st<TPair>() ) ); // yields a const error by the explicit loop for( vector<TPair>::iterator it=v.begin(); it!=v.end(); ++it ) apply_visitor(dummy(), it->first); This is a little bit less general since we have to know the type of v in advance, however, for me it works. Anyway, I would consider the problem as a bug in boost::visitor. The remark in apply_visitor_delayed.hpp about the dead reference doesn't make sense to me. As long as apply_visitor is in action, a temporary visitor object is alive, isn't it?