diff --git a/include/boost/fusion/view/nview/nview.hpp b/include/boost/fusion/view/nview/nview.hpp index f3011834..fe8d35cf 100644 --- a/include/boost/fusion/view/nview/nview.hpp +++ b/include/boost/fusion/view/nview/nview.hpp @@ -31,7 +31,7 @@ namespace boost { namespace fusion struct result; template - struct result : boost::add_reference {}; + struct result : add_reference {}; template typename boost::result_of::type @@ -40,6 +40,24 @@ namespace boost { namespace fusion return x; } }; + + struct addconstref + { + template + struct result; + + template + struct result + : add_reference::type> + {}; + + template + typename boost::result_of::type + operator()(T& x) const + { + return x; + } + }; } struct nview_tag; @@ -58,12 +76,15 @@ namespace boost { namespace fusion typedef Indicies index_type; typedef typename mpl::size::type size; - typedef transform_view transform_view_type; + typedef typename mpl::if_< + is_const, detail::addconstref, detail::addref + >::type transform_type; + typedef transform_view transform_view_type; typedef typename result_of::as_vector::type sequence_type; explicit nview(Sequence& val) - : seq(as_vector(transform_view_type(val, detail::addref()))) + : seq(sequence_type(transform_view_type(val, transform_type()))) {} sequence_type seq;