2016-07-09 17 views
7

Considerare questi due definizioni possibili per una classe:C'è qualche punto nel dichiarare una funzione cancellata come non valida?

Allegato A:

struct A 
{ 
    A() = delete; 
}; 

Exhibit A ':

struct A 
{ 
    A() noexcept = delete; 
} 

c'è qualche punto nel dichiarare una funzione eliminata come noexcept?

+10

Semplicemente, no. Una funzione che è stata cancellata non può essere chiamata (o, nel caso di un costruttore, usata per inizializzare un oggetto) e tanto meno lanciare un'eccezione. – Peter

risposta

7

(Pubblicato questo inizialmente come un commento, ma incoraggiati a inviare come risposta.)

semplicemente, no. Una funzione che è stata cancellata non può essere chiamata (o, nel caso di un costruttore, usata per inizializzare un oggetto) e tanto meno lanciare un'eccezione.

Edit:

hvd citato nei commenti qui sotto che noexcept(f()) non chiama f(). Se il costruttore della classe A è delete d, allora noexcept(A()) non verrà compilato, indipendentemente dal fatto che il costruttore sia dichiarato noexcept. Questa è (essenzialmente) una conseguenza del requisito che a noexcept(expression) venga assegnata un'espressione valida - e un'espressione A() per una classe A richiede un costruttore valido.

Revolver_Ocelot indica inoltre che non è possibile eseguire il sovraccarico su noexcept (vale a dire che non è possibile avere due funzioni con la stessa firma, tranne che una è noexcept e una non è). Pertanto, all'interno di una definizione della classe A, sia lo A() = delete sia lo A() noexcept = delete hanno entrambi lo stesso effetto, vale a dire la classe A che non ha un costruttore senza argomenti.

+4

'noexcept' non ha effetto solo sulla chiamata di funzione. Hai ragione che se una funzione non può essere chiamata, la chiamata alla funzione non può essere influenzata. Ma 'noexcept' in generale può fare la differenza anche senza chiamare nulla, più chiaramente attraverso l'operatore' noexcept' ('noexcept (f())' non chiama 'f()'). Penso che una buona risposta dovrebbe anche spiegare perché nessuno degli altri casi si applica (per esempio, se tutti gli altri casi si applicano solo alle funzioni chiamabili, non si applicano alle funzioni cancellate), o se è possibile (che io sospetto che non lo è), dare un controesempio. – hvd

+1

Anche menzionare che non è possibile eseguire il sovraccarico su 'noexcept' (diversamente da, ad esempio,' const') sarebbe utile. –

+0

Hai ragione, hvd e Revolver_Ocelot. Ho modificato la risposta per incorporare (o rispondere) entrambi i tuoi commenti. La semplice risposta di "no" si applica ancora e le informazioni aggiuntive indicate da ciascuna di esse lo supportano. – Peter