In order to pass arguments by reference to the std::bind function, you use std::reference_wrapper<T>, typically by invoking std::ref.
However, if std::bind is used on a function object whose operator() is itself a template function, that template will be instantiated with std::reference_wrapper<T> rather than T itself, which is incorrect behavior.
For example, the following code does not compile:
using namespace std;
typedef void result_type;
void operator()(T &n)
n = 5;
int n = 0;
auto func = bind(f, ref(n));
cout << n << endl;
This code does compile and work correctly on g++ 4.6.1, or if std::bind/std::ref is replaced with boost::bind/boost::ref.
A real-world example where this is a problem is the Boost.Random library. For example, the following does not work on VC++ (but does on g++):
boost::uniform_int<> distribution(0, 10);
auto func = std::bind(distribution, std::ref(engine));