[/ / Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. / Copyright (c) 2003-2008 Peter Dimov / / Distributed under the Boost Software License, Version 1.0. (See / accompanying file LICENSE_1_0.txt or copy at / http://www.boost.org/LICENSE_1_0.txt) /] [section:limitations Limitations] As a general rule, the function objects generated by `bind` 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 the [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm forwarding problem]. (It will be fixed in the next standard, usually called C++0x.) The library uses signatures of the form template void f(T & t); to accept arguments of arbitrary types and pass them on unmodified. As noted, this does not work with non-const r-values. On compilers that support partial ordering of function templates, a possible solution is to add an overload: template void f(T & t); template void f(T const & t); 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. [endsect]