2011-09-07 11 views
8

In C++ 0x -n3290 Progetto: hanno aggiunto nella sezione: distruttori: 12.4/2 ° punto di ultima rigaUn distruttore Shall OR non deve essere dichiarato con un puntatore? in C++

  **A destructor shall not be declared with a ref-qualifier.** 

in C++ 03 Progetto .... che non ha menzionato questo punto in distruttori?

la mia domanda è se

*~S() ; //this declaration is allowed or not according to the Standard's 
    //**~S(); ***~S() ; etc........... 

è consentito questo tipo di dichiarazione? No dove nel Draft ha descritto questa ... Dichiarazione?

In GCC 4.6.0, Sun/Oracle C++ 12.0, ---> questa dichiarazione è consentito int Comeau C/C++ -> non ammessi

risposta

7

Hai frainteso cosa significa ref-qualificatore nel nuovo standard. Nello stesso modo in cui è possibile fornire un qualificatore const a qualsiasi funzione membro in C++ 03, è inoltre possibile aggiungere un qualificatore di riferimento a una funzione membro in C++ 0x. Che modificatore influenzerà il tipo di this argomento implicito della funzione:

struct test { 
    void f() const &&; // implicit "this" in "f" is of type "test const &&" 
}; 

Nello stesso modo in cui un distruttore non può essere static, o const o const volatile in C++ 03, non può prendere una ref -qualificatore (& o &&) in C++ 0x. Ovviamente questo bit non era presente nel vecchio standard.

+0

@ DAvid: oh ... ma in termini di una dichiarazione di un distruttore ..they detto solo intestano ~ operatore ..ma non dove hanno detto su ... è permesso tale dichiarazione , non ha permesso ecc ... come * ~ a(), e ~ a(), ecc – user751747

+2

@ user751747: la grammatica afferma che il * ref-qualificazione * viene aggiunto alle funzioni in fondo a destra (dopo i * CV-qualificazioni *), e questo significa che la frase si riferisce a: ~ ~ A() &; 'or' ~ A() &&; ', e definisce entrambi come non validi. '' E '&~A(); * ~ A();' non sono validi perché non corrispondono alla grammatica * *, non v'è alcuna necessità di fornire descrizioni aggiuntive su tutto ciò che non dovrebbe compilare. Ad esempio, da nessuna parte nello standard si dice che 'a] [+ =/a' non è corretto, indica solo quali costrutti sono corretti e che uno non corrisponde a nessuno di essi. –

+0

@ David: Grazie – user751747

10

Che non sembra sarebbe mai essere una dichiarazione di funzioni legali di qualsiasi tipo, molto meno per un distruttore. Non sono sicuro di cosa stia parlando quella parte dello standard, ma ho una supposizione.

Sospetto che ci sia un qualificatore che dice che la funzione è stata chiamata su un riferimento di rvalue. Qualcosa di simile a questo:

class A { 
public: 
    void IAmAnRValue() &&; 
}; 

Penso che la lingua nello standard sta dicendo che questa qualificazione non è consentita su un distruttore, molto come avere un trailing const sarebbe anche illegale.

E, a seguito di ulteriori indagini, la mia certezza della correttezza della mia ipotesi sale considerevolmente. Ecco la giustificazione:

Esiste chiaramente che le funzioni possono ora avere un 'qualificatore di riferimento' dopo il 'cv-qualifer'. Ciò significa che una dichiarazione di funzione può ora essere seguita da const & o const volatile && anziché solo da const. E il termine usato (ref-qualifier) ​​è lo stesso del termine usato nel bit dello standard che stai citando. Ed è logico che i distruttori non possano averne uno.

+0

@ Omni: grazie per la tua risposta – user751747

1

La regola che si sta cercando è affermato nello stesso paragrafo, 12.4p2

un distruttore non ha parametri, e nessun tipo di ritorno può essere specificato per esso (neanche void).

La frase "nessun tipo di ritorno può essere specificato per questo" proibisce anche "*", che non è immediatamente chiaro, ma può essere visto dal confronto con 12.3.2p1 (confrontare con this issue report):

... Tali funzioni sono chiamate funzioni di conversione. Non è possibile specificare un tipo di reso.

Questa regola è ciò che rende proibite le implementazioni * operator int() { }. Si può anche discutere con 12.4p1, anche se, come che è formulata molto generale ed è la prima istruzione nella sezione distruttori, penso che l'altra dichiarazione di cui sopra dovrebbe essere l'argomento principale

una sintassi speciale dichiaratore utilizzando un FUNCTION- optional specificatore (7.1.2) seguito da ~ seguito dal nome della classe del distruttore seguito da un elenco di parametri vuoto viene utilizzato per dichiarare il distruttore in una definizione di classe.

Come visibile/lettura non si fa menzione di dichiaratori come * in questa descrizione, che mostra l'intento degli autori.

+0

grazie per la tua risposta – user751747

Problemi correlati