Non riesco a capire alcune sottigliezze durante la combinazione di std :: bind con std :: function.std :: bind a una std :: function si arresta in modo anomalo con Clang
ho ridotto al minimo i miei problemi al seguente frammento di codice:
#include <functional>
#include <iostream>
void bar(int x) {
std::cout << "Hello." << std::endl;
}
int main(int argc, char* argv[])
{
std::function<void(int)> f1 = std::bind(bar, std::placeholders::_1);
// CRASHES with clang, works fine in VS2010 and VS2012
std::function<void()> f2 = std::bind(f1, 1);
f2();
return 0;
}
Nota la conversione esplicita a std :: Funzione <> (sostituendo std::function<void()>
con auto
quando si costruisce f2
funziona bene).
La creazione di f2
copiando l'oggetto f1
si blocca con Clang su OS X (XCode 5.0.1, OS X 10.9 SDK), ma funziona correttamente con VS2010/VS2012. Dopo un lungo e tremendo callstack, il codice si arresta in modo anomalo con un EXC_BAD_ACCESS - nota che questo è quando crea l'oggetto funzione e non quando lo chiama.
Si tratta di un bug nell'implementazione della libreria o di un problema con il mio codice?
Una soluzione è quella di chiamare in modo esplicito il operator()
membro, in questo modo:
std::function<void()> f2 =
std::bind(&std::function<void(int)>::operator(), f1, 1);
ma questo viene fornito con un avvertimento, in quanto non riesce a compilare il VS2012 (ma lavora in VS2010). Questo sembra essere a bug with VS2012.
Una domanda correlata sembra essere http://stackoverflow.com/q/19820128/227322. – villintehaspam