Estoy atascado leyendo la descripción de std::bind
en N3225, en la subsección 20.8.10.1
. Dice lo siguiente debe imprimir 1
, pero pensé que se supone que bind
copia sus argumentos y por lo tanto debe imprimir 0
. Si uno quiere referirse al argumento pasado, uno necesita usar std::ref
, ¿verdad?¿Qué diablos hace std :: bind (x, y) do?
void f(int &a) { a = 1; }
int main() {
int a = 0;
std::bind(f, a)();
std::cout << a << std::endl;
}
salidas del CCG 0
, coincidiendo con lo que pensé que las cosas funcionen. Pero N3225 dice que std::bind(f, a1)
devolverán una envoltura llamada que cuando se le llama por wrapper()
llamará INVOKE(f, v1)
, donde v1
será a
(el argumento pasé en, en otras palabras, usando binds
's de parámetros de entrada, que es un parámetro de reenvío perfecto, std::forward<A1>(a1)
) .
INVOKE(f, a)
se define en 20.8.2 a f(a)
. Por lo tanto, esto define que la llamada al contenedor de llamadas devuelto pasa el argumento original. ¿Qué me estoy perdiendo?
http://stackoverflow.com/questions/4327474/does-perfect-forwarding-in-c0x-make-reference-wrapper-deprecated (No es un duplicado pero está relacionado, si obtendremos un "reenvío perfecto" en C + + 0x) – CashCow