Gli std :: stream sono già mobili?
Domanda
GNU gcc 4.3 supporta parzialmente il prossimo standard c ++ 0x: tra le funzionalità implementate il riferimento al valore. Tramite il riferimento al valore dovrebbe essere possibile spostare un oggetto non copiabile o restituirlo da una funzione.
I flussi std :: streams sono già mobili mediante riferimento al valore rvalore o manca l'implementazione della libreria corrente?
Soluzione
Nell'attuale sv ++ g ++, il supporto di riferimento rvalue non è stato ancora aggiunto ai flussi. Ho il sospetto che aggiungerlo non sarà troppo difficile e come sempre con il software open source, le patch sono, sono sicuro, il benvenuto!
Altri suggerimenti
Dopo una rapida indagine viene fuori che il supporto riferimento valore non è stato ancora aggiunto agli stream.
Per restituire un oggetto non copiabile da una funzione è infatti sufficiente implementare sposta costruttore come segue:
struct noncopyable
{
noncopyable()
{}
// move constructor
noncopyable(noncopyable &&)
{}
private:
noncopyable(const noncopyable &);
noncopyable &operator=(const noncopyable &);
};
Si suppone che tale costruttore trasferisca la proprietà sul nuovo oggetto lasciando quello che viene passato in uno stato predefinito.
Detto questo, è possibile restituire un oggetto da una funzione in questo modo:
noncopyable factory()
{
noncopyable abc;
return std::move(abc);
}
Sebbene std :: stream non supporti i costruttori di spostamento, sembra che i contenitori STL forniti con gcc 4.3.2 lo supportino già.