2015-08-06 23 views
7

La domanda è come afferma il mio titolo.Un costruttore di mosse di default è considerato dichiarato dall'utente?

Sto chiedendo perché ho una classe con un costruttore di mosse predefinito, ma il codice che tenta di eseguire l'assegnazione della copia non sta affermando che l'operatore di assegnazione copia è eliminato (secondo Visual Studio 2015).

così ho controllato le regole here per operatori di assegnazione di copia implicitamente dichiarate:

Il implicitamente dichiarata o predefinita operatore di assegnazione copia per la classe T è definito come cancellato in una qualsiasi delle seguenti condizioni:

  • ...
  • T ha un costruttore mossa dall'utente dichiarato
  • T ha un operatore di assegnazione mossa dall'utente dichiarato

Quindi, in pratica non sono sicuro se un in default mossa conta costruttore come dall'utente dichiarato. Il mio istinto mi dice di sì, ma quando si tratta di standard, mi piace sempre essere sicuro poiché le ipotesi possono essere costose.

+0

Sì – Praetorian

+0

@Praetorian Fiera abbastanza. Perché VS2015 si lamenta? Quando rimuovo il mio costruttore di movimento predefinito, il codice viene compilato correttamente. –

+0

Presumibilmente la classe contiene dati membri che sono tutti trasferibili. Quando si rimuove il costruttore di spostamento dichiarato dall'utente non c'è nulla che impedisca la dichiarazione implicita di un operatore di assegnazione copia – Praetorian

risposta

1

Lo standard dice:

12,8 Copia e spostamento oggetti di classe [class.copy]

Se la definizione della classe non dichiara esplicitamente un costruttore di copia, si è dichiarato in modo implicito. Se la definizione della classe dichiara un costruttore di spostamenti o un operatore di spostamento, il costruttore di copie implicitamente dichiarato viene definito come eliminato; altrimenti, è definito come predefinito (8.4). Il secondo caso è deprecato se la classe ha un operatore di assegnazione copia dichiarato dall'utente o un distruttore dichiarato dall'utente.

Se la definizione della classe non dichiara esplicitamente un operatore di assegnazione copia, uno viene dichiarato implicitamente. Se la definizione della classe dichiara un costruttore di spostamenti o un operatore di spostamento, l'operatore di assegnazione della copia dichiarata implicitamente viene definito come eliminato; altrimenti, è definito come predefinito (8.4). Il secondo caso è deprecato se la classe ha un costruttore di copie dichiarato dall'utente o un distruttore dichiarato dall'utente.

La classe ha un costruttore di spostamenti predefinito, ma è dichiarato esplicitamente. Quindi, in base allo standard implicitamente dichiarato costruttore di copia e assegnazione copia, l'operatore è definito come cancellato.

8.4.2 funzioni in modo esplicito-default [dcl.fct.def.default]

funzioni esplicitamente-in default e funzioni implicitamente-dichiarate sono chiamati collettivamente le funzioni di default, e l'implementazione forniscono definizioni implicite per loro (12.1 12.4, 12.8), che potrebbe significare definirli come cancellati. Una funzione è fornita dall'utente se è dichiarata dall'utente e non è esplicitamente impostata o cancellata nella sua prima dichiarazione. Una funzione esplicitamente impostata dall'utente (ad es., predefinito in modo esplicito dopo la prima dichiarazione) viene definito nel punto in cui è esplicitamente impostato come predefinito.

Utilizzando questa terminologia il costruttore di movimento è dichiarato dall'utente, ma non fornito dall'utente.

+0

La domanda riguarda la copia * assegnazione *, non copia * costruzione *. La mia classe ha già un costruttore di copie predefinito. –

+0

Lo stesso vale per l'operatore di assegnazione. Aggiunta citazione a riguardo. –

0

Un default funzione membro speciale dall'utente dichiarata ma è anche definito dall'utente come stabilizzato. Lo standard non definisce esplicitamente il termine "dichiarato dall'utente", ma essenzialmente indica qualsiasi funzione membro speciale che deve essere scritta dall'utente. Quindi il seguente dichiara un costruttore e lo definisce come predefinito.

struct X { 
    X() = default; // declaration and definition 
}; 

Definire una funzione membro come default si intende la definizioneè equivalente alla definizione implicita. È dichiarato dall'utente in virtù del fatto che deve essere digitato dall'utente.

Problemi correlati