Je suis bloqué en lisant la description de std::bind
dans N3225, dans la sous-section 20.8.10.1
. Il dit que ce qui suit devrait imprimer 1
, mais je pensais que bind
est censé copier ses arguments et à ce titre, il devrait imprimer 0
. Si l'on veut se référer à l'argument passé, il faut utiliser std::ref
, non?Que diable fait std :: bind (x, y)?
void f(int &a) { a = 1; }
int main() {
int a = 0;
std::bind(f, a)();
std::cout << a << std::endl;
}
sorties GCC 0
, en accord avec ce que je pensais que les choses fonctionnent. Mais N3225 dit que std::bind(f, a1)
renvoie un wrapper d'appel que lorsqu'il est appelé par wrapper()
appellera INVOKE(f, v1)
, où v1
sont a
(l'argument je suis passé, autrement dit, en utilisant le paramètre entrant de binds
qui est un paramètre de transfert parfait, std::forward<A1>(a1)
) .
INVOKE(f, a)
est défini par 20.8.2 à f(a)
. Ainsi, cela définit que l'appel à l'encapsuleur d'appel renvoyé passe l'argument d'origine. Qu'est-ce que je rate?
http://stackoverflow.com/questions/4327474/does-perfect-forwarding-in-c0x-make-reference-wrapper-deprecated (Pas un doublon mais lié, si nous obtiendrons un "transfert parfait" en C + + 0x) – CashCow