Il seguente codice non può essere compilato:std :: bind e spedizioni perfetto
#include <functional>
template<class ...Args>
void invoke(Args&&... args)
{
}
template<class ...Args>
void bind_and_forward(Args&&... args)
{
auto binder = std::bind(&invoke<Args...>, std::forward<Args>(args)...);
binder();
}
int main()
{
int a = 1;
bind_and_forward(a, 2);
}
Se ho capito bene, la ragione è la seguente: std::bind
copia i suoi argomenti, e quando s' il binder
operator()
si chiama, passa tutti gli argomenti associati come lvalues - anche quelli che sono entrati in bind
come rvalues . Ma invoke
è stato istanziato per gli argomenti originali e non può accettare ciò che lo binder
tenta di passarlo.
Esiste una soluzione per questo problema?
Ma in questo caso non verrà compilato per un argomento incluso con 'std :: ref()'. –
@IgorR. Aggiornato per quello - 'bind()' fa qualcosa di speciale per 'std :: ref()'. Quindi dovresti fare anche qualcosa di speciale. – Barry