2013-11-20 8 views
7

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.

+0

Una domanda correlata sembra essere http://stackoverflow.com/q/19820128/227322. – villintehaspam

risposta

2

Il codice funziona perfettamente con clang 3.4 (trunk, 194324). Funziona anche con gcc 4.7.2.

Non ricevo alcun avviso con -Wall -Wextra -pedantic (eccetto quelli che si lamentano dei parametri x, argc e argv inutilizzati).

Sembra che l'implementazione clang fosse difettosa in passato, ma è stata corretta.

+0

Hai ragione, l'aggiornamento a Xcode 5.0.2 sembra fare il trucco. – villintehaspam

+0

@villintehaspam Felice di sentirlo! – Ali

+0

Tuttavia, una parola di cautela sembra che ci sia una qualche differenza tra XCode 5.0.2 scaricato da App Store e uno scaricato da developer.apple.com. Funziona nella versione scaricata da dev, ma non in quella da App Store. – villintehaspam

Problemi correlati