Sto cercando di andare d'accordo con std::function
. Dal riferimento here si può vedere che l'argomento del codice std::function
deve essere richiamabile e copiabile. Quindi ecco un piccolo esempio:std :: funzione per oggetto funzione MoveConstructible in gcc
#include <iostream>
#include <type_traits>
#include <functional>
class A {
public:
A(int a = 0): a_(a) {}
A(const A& rhs): a_(rhs.a_) {}
A(A&& rhs) = delete;
void operator()()
{
std::cout << a_ << std::endl;
}
private:
int a_;
};
typedef std::function<void()> Function;
int main(int argc, char *argv[])
{
std::cout << std::boolalpha;
std::cout << "Copy constructible: "
<< std::is_copy_constructible<A>::value << std::endl;
std::cout << "Move constructible: "
<< std::is_move_constructible<A>::value << std::endl;
//Function f = A();
return 0;
}
Abbiamo chiamabile, copiabile ma non sposta classe costruibile. Credo che questo dovrebbe essere sufficiente per avvolgerlo in Function
. Ma se commentate il commento del compilatore di commenti, il compilatore di riga diventa molto turbato dal costruttore di mosse eliminato. Ecco il link ideone. GCC 4.8.0 non compila anche questo.
Quindi, è qualcosa che non capisco circa std::function
o è un comportamento errato di GCC?
Ho appena provato con clang ++, lo stesso problema lì. –
I _think_ la funzione 'delete'd è ancora considerata durante la risoluzione di sovraccarico, e in questo caso viene selezionata prima del costruttore di copie e causa l'errore. Per correggere, rimuovere la dichiarazione del costruttore di spostamento in quanto uno non verrà generato implicitamente a causa dell'esistenza del costruttore dichiarato dall'utente. Inoltre, vedi [questa domanda] (http://stackoverflow.com/questions/16897845/move-member-function-generation) per informazioni su "is_move_constructible". – hmjd
@hmjd Yup. http://stackoverflow.com/q/14085620/1171191 – BoBTFish