2015-11-07 21 views
6

C'è qualche differenza tra un default definito dall'utente costruttoreDifferenza tra costruttore e costruttore predefiniti (definiti dall'utente) con argomenti predefiniti?

class Simple 
{ 
public: 
    Simple() {} 
}; 

e un costruttore definito dall'utente che prende più argomenti, ma ha valori di default per ognuno di questi

class WithDefaults 
{ 
public: 
    WithDefaults(int i = 1) {} 
}; 

diverso da quello WithDefaults può anche essere costruito con un valore esplicito per i?

In particolare, mi chiedo, per quanto riguarda la lingua, se questi due costruttori eseguono lo stesso rotolo di costruttori predefiniti per entrambi, o se ci sono sottili differenze tra le proprietà delle classi?

In altre parole, è un costruttore che ha valori predefiniti per tutti i suoi argomenti un costruttore predefinito in ogni modo?

+0

Mi aspettavo che questo fosse un duplicato, in realtà, ma non riesco a trovare questa risposta da nessuna parte. – MicroVirus

+0

È quasi * risposto * in [Parametri predefiniti con costruttori C++] (http://stackoverflow.com/questions/187640/default-parameters-with-c-constructors), penso, ma non ne sono sicuro. – MicroVirus

+1

In isolamento, penso, le lezioni sono le stesse. Possono agire in modo diverso quando vengono prese in considerazione le conversioni. Il link nel secondo commento di @MicorVirus lo spiega ulteriormente. –

risposta

6
bozza di lavoro

standard attuale N4527 [12.1p4]:

Un costruttore dipredefinito per una classe X è un costruttore di classe X che o non ha parametri altrimenti ogni parametro che non è un function parameter pack ha un argomento predefinito. [...]

Quindi sì, il costruttore della seconda classe è un costruttore predefinito perfettamente valido.


Solo una nota che la formulazione nelle versioni pubblicate di C++ 11 e 14 era leggermente diverso, ma non fa la differenza per la tua domanda. Ha usato essere:

Un costruttore dipredefinito per una classe X è un costruttore di classe X che può essere chiamata senza argomenti.

La modifica della formulazione è stato effettuato a seguito di DR 1630, per chiarire la semantica di inizializzazione predefinito. Precedentemente, c'erano degli standard nello standard che si riferivano a "il costruttore predefinito" ", il che implica che ce ne può essere uno solo; l'attuale formulazione è pensata per supportare scenari più complessi, in cui è possibile avere diversi costruttori (ad esempio utilizzando SFINAE), e quello utilizzato viene scelto usando la normale risoluzione di sovraccarico.

+0

Anche se * è * una piccola differenza da considerare per la compatibilità ABI. – Deduplicator

+1

@Deduplicator Un buon punto, ma suppongo che rientri nella dichiarazione generale "una funzione con argomenti predefiniti per tutti i parametri può essere chiamata con la stessa sintassi di quella che non ne ha, ma ciò non significa che i due le funzioni hanno la stessa firma ". – bogdan

Problemi correlati