2012-02-12 10 views
13

Ho letto alcuni articoli contraddittori riguardo al fatto che i costruttori/incarichi di movimento possano lanciare o meno.I costruttori di movimento richiesti non devono essere esclusi?

Pertanto vorrei chiedere se ai costruttori/assegnatari di movimenti è consentito introdurre lo standard C++ 11 finale?

+0

Non ho visto nulla nello standard per i costruttori di mosse non autorizzati a lanciare, ma ho visto che "Il costruttore di mosse implicitamente dichiarato per la classe X avrà il formato ' X :: X (X &&) ' ", e non vedo" noexcept "lì dentro. –

+0

Nella bozza finale, non vedo 'noexcept' dichiarata per qualsiasi funzione ... – ronag

+0

@ronag: Sei sicuro di star guardando? Perché ho aperto N3337 e ho cercato "noexcept" e ho ottenuto immediatamente la funzione 'swap' della classe. –

risposta

17

I costruttori di traslochi in generale sono autorizzati a lanciare? Sì. Dovrebbero loro? No.

In generale, niente di ciò che si fa al loro interno dovrebbe essere qualsiasi cosa che possa essere lanciata. Non dovresti allocare memoria, chiamare altro codice o qualcosa del genere. L'unica ragione per scrivere un costruttore di mosse è di scappare con i puntatori di memoria e i riferimenti agli oggetti di qualcun altro. Dovresti copiare alcuni tipi di base e annullare i valori nell'altro oggetto. Quelle cose non dovrebbero buttare.

Quindi mentre è permesso, non è una buona idea. Se lo fai, ripensa quello che stai facendo nelle tue operazioni di spostamento.

+0

Suppongo che nessun tipo di stl lanci nel costruttore di move? Gli unici posti che dovrei preoccuparmi sono con l'USD? – ronag

+6

@ronag: se il tipo std :: non ha una 'noexcept' sul suo costruttore di mosse, può lanciare. Nello specifico, alcune implementazioni di contenitori basati su nodi hanno un costruttore di spostamento di lancio poiché ogni contenitore deve contenere un nodo finale allocato all'heap, anche contenitori vuoti. Altre implementazioni di questi stessi contenitori non hanno questo design e quindi possono (e sono autorizzati a) avere un costruttore di movimento no-outs. –

Problemi correlati