|
Boost-Commit : |
From: pdimov_at_[hidden]
Date: 2008-02-19 10:09:10
Author: pdimov
Date: 2008-02-19 10:09:10 EST (Tue, 19 Feb 2008)
New Revision: 43321
URL: http://svn.boost.org/trac/boost/changeset/43321
Log:
Fix #1642.
Text files modified:
trunk/libs/bind/bind.html | 39 +++++++++++++++++++++------------------
1 files changed, 21 insertions(+), 18 deletions(-)
Modified: trunk/libs/bind/bind.html
==============================================================================
--- trunk/libs/bind/bind.html (original)
+++ trunk/libs/bind/bind.html 2008-02-19 10:09:10 EST (Tue, 19 Feb 2008)
@@ -307,21 +307,22 @@
<h3><a name="operators">Overloaded operators</a> (new in Boost 1.33)</h3>
<p>For convenience, the function objects produced by <tt>bind</tt> overload the
logical not operator <code>!</code> and the relational and logical operators <code>==</code>,
- <code>!=</code>, <code><</code>, <code><=</code>, <code>></code>,
- <code>>=</code>, <code>&&</code>, <code>||</code>.</p>
+ <code>!=</code>, <code><</code>, <code><=</code>, <code>></code>, <code>>=</code>,
+ <code>&&</code>, <code>||</code>.</p>
<P><tt>!bind(f, ...)</tt> is equivalent to <tt>bind( <EM>logical_not</EM>(), bind(f,
...) )</tt>, where <tt><EM>logical_not</EM></tt> is a function object that
takes one argument <tt>x</tt> and returns <tt>!x</tt>.</P>
- <P><tt>bind(f, ...) <EM>op</EM> x</tt>, where <EM>op</EM> is a relational or logical operator,
- is equivalent to <tt>bind( <EM>relation</EM>(), bind(f, ...), x )</tt>, where <em>relation</em>
- is a function object that takes two arguments <tt>a</tt> and <tt>b</tt> and
- returns <tt>a <EM>op</EM> b</tt>.</P>
+ <P><tt>bind(f, ...) <EM>op</EM> x</tt>, where <EM>op</EM> is a relational or
+ logical operator, is equivalent to <tt>bind( <EM>relation</EM>(), bind(f, ...), x )</tt>,
+ where <em>relation</em> is a function object that takes two arguments <tt>a</tt>
+ and <tt>b</tt> and returns <tt>a <EM>op</EM> b</tt>.</P>
<P>What this means in practice is that you can conveniently negate the result of <tt>bind</tt>:</P>
<P><tt>std::remove_if( first, last, !bind( &X::visible, _1 ) ); // remove invisible
objects</tt></P>
<P>and compare the result of <tt>bind</tt> against a value:</P>
<P><tt>std::find_if( first, last, bind( &X::name, _1 ) == "Peter" );</tt></P>
- <P><tt>std::find_if( first, last, bind( &X::name, _1 ) == "Peter" || bind( &X::name, _1 ) == "Paul" );</tt></P>
+ <P><tt>std::find_if( first, last, bind( &X::name, _1 ) == "Peter" || bind(
+ &X::name, _1 ) == "Paul" );</tt></P>
<P>against a placeholder:</P>
<P><tt>bind( &X::name, _1 ) == _2</tt></P>
<P>or against another <tt>bind</tt> expression:</P>
@@ -384,10 +385,12 @@
}
</pre>
<h2><a name="Limitations">Limitations</a></h2>
- <p>The function objects generated by <b>bind</b> take their arguments by reference
- and cannot, therefore, accept non-const temporaries or literal constants. This
- is an inherent limitation of the C++ language, known as <A href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm">
- the forwarding problem</A>.</p>
+ <p>As a general rule, the function objects generated by <b>bind</b> take their
+ arguments by reference and cannot, therefore, accept non-const temporaries or
+ literal constants. This is an inherent limitation of the C++ language in its
+ current (2003) incarnation, known as <A href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm">
+ the forwarding problem</A>. (It will be fixed in the next standard, usually
+ called C++0x.)</p>
<p>The library uses signatures of the form
</p>
<pre>template<class T> void f(T & t);
@@ -395,17 +398,17 @@
<p>to accept arguments of arbitrary types and pass them on unmodified. As noted,
this does not work with non-const r-values.
</p>
- <p>An oft-proposed "solution" to this problem is to add an overload:
+ <p>On compilers that support partial ordering of function templates, a possible
+ solution is to add an overload:
</p>
<pre>template<class T> void f(T & t);
template<class T> void f(T const & t);
</pre>
- <p>Unfortunately, this (a) requires providing 512 overloads for nine arguments and
- (b) does not actually work for const arguments, both l- and r-values, since the
- two templates produce the exact same signature and cannot be partially ordered.
- </p>
- <p>[Note: this is a dark corner of the language, and the <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#214">
- corresponding issue</a> has only recently been resolved.]
+ <p>Unfortunately, this requires providing 512 overloads for nine arguments, which
+ is impractical. The library chooses a small subset: for up to two arguments, it
+ provides the const overloads in full, for arities of three and more it provides
+ a single additional overload with all of the arguments taken by const
+ reference. This covers a reasonable portion of the use cases.
</p>
<h2><a name="FAQ">Frequently Asked Questions</a></h2>
<h3><a name="Q_doesnt_compile">Why doesn't this compile?</a></h3>
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk