2011-09-08 18 views
6

C'è qualche posto in cui posso confermare questo? Non sono sicuro che sia il problema di GCC o del mio codice. Ad esempio, il seguente codice non viene compilato:GCC 4.4/4.5 unique_ptr non funziona per unordered_set/unordered_map

#include <unordered_set> 
#include <memory> 
using namespace std; 

int main() { 
    unordered_set<unique_ptr<int> > s; 
    unique_ptr<int> p(new int(0)); 
    s.insert(move(p)); 
    return 0; 
} 

Il messaggio di errore è troppo grande e non voglio mettere qui. La versione di GCC è 4.5.3, il flag di compilazione è -std = gnu ++ 0x. Testato anche su 4.4.5.

+0

Ciò è probabilmente dovuto al fatto che 'std :: hash' non è specializzato per' std :: unique_ptr'. – Mankarse

+1

@Mankarse C'è una specializzazione per esso, ma in modo confuso appare in 20.7.2.6 Supporto hash puntatore intelligente [util.smartptr.hash] (n3290) subito dopo le specifiche per 'std :: shared_ptr', un po 'lontano da' std :: unique_ptr'. –

+0

N.B. dovresti dire 'std :: move' not' move', non vuoi che ADL trovi una funzione diversa. –

risposta

4

Il tuo codice è corretto. Questo è un problema noto in GCC 4.5. È stato corretto in 4.6. Vedi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436. Colpisce anche i contenitori ordinati (std :: map, std :: set etc). Probabilmente la soluzione più semplice (con una leggera penalizzazione delle prestazioni) sarebbe quella di usare std :: shared_ptr invece di std :: unique_ptr.

8

GCC 4.6.1 accetta il codice così com'è e non vedo nulla di sbagliato (vale a dire che value_type di un contenitore associativo è richiesto per essere EmplaceInsertable e std::unique_ptr non lo impedisce). Presumibilmente questa è una carenza di GCC 4.5.

3

Posso confermare che questo è un problema con GCC 4.4.5. Il tentativo di inserire un unique_ptr in uno std :: set si traduce in un messaggio di errore del compilatore lunga che allude al fatto che una qualche funzione nel STL ha tentato di copiare l'unique_ptr:

error: deleted function [unique_ptr's copy ctor]... used here [g++-v4/bits/stl_tree.h:136].

La funzione STL in questione è parte di la struttura ad albero interna di diverse classi STL, incluso std :: set. È anche all'interno di un "__GXX_EXPERIMENTAL_CXX0X__" ifdef, che presumibilmente significa che GCC 4.4 non supporta ufficialmente ciò che stiamo cercando di fare.

Se non si desidera eseguire l'aggiornamento a GCC 4.6, è sempre possibile eseguire il wrapping di un file std :: vector e verificare strategicamente la presenza e la rimozione di duplicati in determinati punti del codice.

Problemi correlati