An interesting peculiarity of functions like <aclass="link"href="sequence/intrinsic/functions/at.html"title="at"><codeclass="computeroutput"><spanclass="identifier">at</span></code></a> when applied to a <aclass="link"href="sequence/concepts/forward_sequence.html"title="Forward Sequence">Forward
Sequence</a> like <aclass="link"href="container/list.html"title="list"><codeclass="computeroutput"><spanclass="identifier">list</span></code></a>
constant compile time complexities. There is an overloaded function, <codeclass="computeroutput"><spanclass="identifier">f</span><spanclass="special">(</span><spanclass="identifier">k</span><spanclass="special">)</span></code>, for each key <spanclass="emphasis"><em>type</em></span><codeclass="computeroutput"><spanclass="identifier">k</span></code>. The compiler chooses the appropriate function
given a key, <codeclass="computeroutput"><spanclass="identifier">k</span></code>.
For example, the fusion <codeclass="computeroutput"><spanclass="identifier">result_of</span><spanclass="special">::</span><spanclass="identifier">begin</span></code> metafunction
<codeclass="computeroutput"><spanclass="identifier">Sequence</span></code> is the type for
which a suitable implementation of <codeclass="computeroutput"><spanclass="identifier">result_of</span><spanclass="special">::</span><spanclass="identifier">begin_impl</span></code>
<codeclass="computeroutput"><spanclass="identifier">traits</span><spanclass="special">::</span><spanclass="identifier">tag_of</span></code> is the metafunction that associates
<codeclass="computeroutput"><spanclass="identifier">Sequence</span></code> with an appropriate
<codeclass="computeroutput"><spanclass="identifier">result_of</span><spanclass="special">::</span><spanclass="identifier">begin_impl</span></code> is the template which is specialized
containers extend themselves in place though member functions such as <aclass="link"href="algorithm/transformation/functions/push_back.html"title="push_back"><codeclass="computeroutput"><spanclass="identifier">push_back</span></code></a> and <aclass="link"href="algorithm/transformation/functions/insert.html"title="insert"><codeclass="computeroutput"><spanclass="identifier">insert</span></code></a>. <ahref="http://www.boost.org/libs/mpl/index.html"target="_top">MPL</a>
<codeclass="computeroutput"><spanclass="identifier">push_back</span></code> does not actually
mutate an <codeclass="computeroutput"><spanclass="identifier">mpl</span><spanclass="special">::</span><spanclass="identifier">vector</span></code>. It can't do that. Instead, it returns
an extended <codeclass="computeroutput"><spanclass="identifier">mpl</span><spanclass="special">::</span><spanclass="identifier">vector</span></code>.
potentially expensive sequence operations. For example, given a <aclass="link"href="container/vector.html"title="vector"><codeclass="computeroutput"><spanclass="identifier">vector</span></code></a>, Fusion's <aclass="link"href="algorithm/transformation/functions/push_back.html"title="push_back"><codeclass="computeroutput"><spanclass="identifier">push_back</span></code></a> returns a <aclass="link"href="view/joint_view.html"title="joint_view"><codeclass="computeroutput"><spanclass="identifier">joint_view</span></code></a>, instead of an actual extended
Functions that take in elemental values to form sequences (e.g. <aclass="link"href="container/generation/functions/make_list.html"title="make_list"><codeclass="computeroutput"><spanclass="identifier">make_list</span></code></a>) convert their arguments
returns a <aclass="link"href="container/list.html"title="list"><codeclass="computeroutput"><spanclass="identifier">list</span></code></a><codeclass="computeroutput"><spanclass="special"><</span><spanclass="keyword">int</span><spanclass="special">,</span>
Fusion's generation functions (e.g. <aclass="link"href="container/generation/functions/make_list.html"title="make_list"><codeclass="computeroutput"><spanclass="identifier">make_list</span></code></a>) by default stores the element
Sometimes the plain non-reference type is not desired. You can use <codeclass="computeroutput"><spanclass="identifier">boost</span><spanclass="special">::</span><spanclass="identifier">ref</span></code>
and <codeclass="computeroutput"><spanclass="identifier">boost</span><spanclass="special">::</span><spanclass="identifier">cref</span></code> to store references or const references
may be used. To bypass the restriction of not having actual lvalues that represent
the elements of the fusion sequence, but rather a sequence of paired expressions
that access the elements, the actual return type of fusion's intrinsic sequence
access functions (<aclass="link"href="sequence/intrinsic/functions/at.html"title="at"><codeclass="computeroutput"><spanclass="identifier">at</span></code></a>, <aclass="link"href="sequence/intrinsic/functions/at_c.html"title="at_c"><codeclass="computeroutput"><spanclass="identifier">at_c</span></code></a>, <aclass="link"href="sequence/intrinsic/functions/at_key.html"title="at_key"><codeclass="computeroutput"><spanclass="identifier">at_key</span></code></a>, <aclass="link"href="iterator/functions/deref.html"title="deref"><codeclass="computeroutput"><spanclass="identifier">deref</span></code></a>, and <aclass="link"href="iterator/functions/deref_data.html"title="deref_data"><codeclass="computeroutput"><spanclass="identifier">deref_data</span></code></a>) is a proxy type, an instance
of <codeclass="computeroutput"><spanclass="identifier">adt_attribute_proxy</span></code>, that
encapsulates these expressions.
</p>
<p>
<codeclass="computeroutput"><spanclass="identifier">adt_attribute_proxy</span></code> is defined
in the namespace <codeclass="computeroutput"><spanclass="identifier">boost</span><spanclass="special">::</span><spanclass="identifier">fusion</span><spanclass="special">::</span><spanclass="identifier">extension</span></code> and has three template arguments:
When adapting a class type, <codeclass="computeroutput"><spanclass="identifier">adt_attribute_proxy</span></code>
is specialized for every element of the adapted sequence, with <codeclass="computeroutput"><spanclass="identifier">Type</span></code> being the class type that is adapted,
<codeclass="computeroutput"><spanclass="identifier">Index</span></code> the 0-based indices of
the elements, and <codeclass="computeroutput"><spanclass="identifier">Const</span></code> both
<codeclass="computeroutput"><spanclass="keyword">true</span></code> and <codeclass="computeroutput"><spanclass="keyword">false</span></code>.
The return type of fusion's intrinsic sequence access functions for the <spanclass="emphasis"><em>N</em></span>th
element of an adapted class type <codeclass="computeroutput"><spanclass="identifier">type_name</span></code>
is <codeclass="literal">adt_attribute_proxy<type_name, <spanclass="emphasis"><em>N</em></span>, <spanclass="emphasis"><em>Const</em></span>></code>,
with <codeclass="literal"><spanclass="emphasis"><em>Const</em></span></code> being <codeclass="computeroutput"><spanclass="keyword">true</span></code>
for constant instances of <codeclass="computeroutput"><spanclass="identifier">type_name</span></code>
and <codeclass="computeroutput"><spanclass="keyword">false</span></code> for non-constant ones.
Attribute descriptor of the <spanclass="emphasis"><em>N</em></span>th attribute of <codeclass="computeroutput"><spanclass="identifier">type_name</span></code> as passed to the adaption
<codeclass="literal">adt_attribute_proxy<type_name, <spanclass="emphasis"><em>N</em></span>, <codeclass="computeroutput"><spanclass="keyword">false</span></code>></code> with <spanclass="emphasis"><em>N</em></span>
being an integral constant, 0≤<spanclass="emphasis"><em>N</em></span><M
<codeclass="literal">adt_attribute_proxy<type_name, <spanclass="emphasis"><em>N</em></span>, <codeclass="computeroutput"><spanclass="keyword">true</span></code>></code> with <spanclass="emphasis"><em>N</em></span>
being an integral constant, 0≤<spanclass="emphasis"><em>N</em></span><M
Invokes <codeclass="literal">set_expr<spanclass="emphasis"><em>N</em></span></code>, with
<codeclass="computeroutput"><spanclass="identifier">t</span></code> being an arbitrary
object. <codeclass="literal">set_expr<spanclass="emphasis"><em>N</em></span></code> may access
the variables named <codeclass="computeroutput"><spanclass="identifier">obj</span></code>
of type <codeclass="computeroutput"><spanclass="identifier">type_name</span><spanclass="special">&</span></code>, which represent the corresponding
instance of <codeclass="computeroutput"><spanclass="identifier">type_name</span></code>,
and <codeclass="computeroutput"><spanclass="identifier">val</span></code> of an arbitrary
const-qualified reference template type parameter <codeclass="computeroutput"><spanclass="identifier">Val</span></code>,
which represents <codeclass="computeroutput"><spanclass="identifier">t</span></code>.
Invokes <codeclass="literal">get_expr<spanclass="emphasis"><em>N</em></span></code> and forwards
its return value. <codeclass="literal">get_expr<spanclass="emphasis"><em>N</em></span></code>
may access the variable named <codeclass="computeroutput"><spanclass="identifier">obj</span></code>
of type <codeclass="computeroutput"><spanclass="identifier">type_name</span><spanclass="keyword">const</span><spanclass="special">&</span></code>
which represents the underlying instance of <codeclass="computeroutput"><spanclass="identifier">type_name</span></code>.
<codeclass="literal">attribute_const_type<spanclass="emphasis"><em>N</em></span></code> may
specify the type that <codeclass="literal">get_expr<spanclass="emphasis"><em>N</em></span></code>
denotes to.
</p>
</td>
</tr>
</tbody>
</table></div>
<p>
Additionally, <codeclass="literal">proxy_type<spanclass="emphasis"><em>N</em></span></code> and <codeclass="literal">const_proxy_type<spanclass="emphasis"><em>N</em></span></code>
are copy constructible, copy assignable and implicitly convertible to <codeclass="literal">proxy_type<spanclass="emphasis"><em>N</em></span>::type</code>
or <codeclass="literal">const_proxy_type<spanclass="emphasis"><em>N</em></span>::type</code>.
Note that the type of a string literal is an array of const characters, not
<codeclass="computeroutput"><spanclass="keyword">const</span><spanclass="keyword">char</span><spanclass="special">*</span></code>. To get <aclass="link"href="container/generation/functions/make_list.html"title="make_list"><codeclass="computeroutput"><spanclass="identifier">make_list</span></code></a> to create a <aclass="link"href="container/list.html"title="list"><codeclass="computeroutput"><spanclass="identifier">list</span></code></a> with an element of a non-const
array type one must use the <codeclass="computeroutput"><spanclass="identifier">ref</span></code>
wrapper (see <aclass="link"href="notes.html#fusion.notes.boost__ref"><codeclass="computeroutput"><spanclass="identifier">boost</span><spanclass="special">::</span><spanclass="identifier">ref</span></code></a>).