2014-09-16 6 views
7

Perché il nuovo operatore sovraccarico è implicitamente statico e come è possibile allocare memoria chiamando il nuovo operatore sovraccarico senza operatore di risoluzione dell'ambito?Perché il nuovo operatore sovraccarico è implicitamente statico e non è richiesta la risoluzione dell'ambito per costruire l'oggetto

A mio avviso, se qualcosa è statico, possiamo chiamarlo in main tramite il nome della classe.

class xyz 
{ 
    void* operator new (size_t size); //implicitly declared static 
    void operator delete (void *p); //implicitly declared static 
}; 

int main() 
{ 
    C *p = new C; 
    delete p; 
} 

risposta

5

Il draft C++ standard dice nella sezione 5.3.4Nuova paragrafo che se la nuova espressione non inizia con :: allora viene cercato nel perimetro di che tipo e poi, se non si trova a livello globale :

Se la nuova espressione inizia con un operatore unario ::, il nome della funzione allocazione viene individuato nell'ambito globale. Altrimenti, se il tipo allocato è un tipo di classe T o un array di esso, il nome della funzione di assegnazione viene cercato nell'ambito di T. Se questa ricerca non riesce a trovare il nome, o se il tipo assegnato non è un tipo di classe , il nome della funzione allocazione viene cercato nel campo di applicazione globale

quanto al motivo per cui è implicitamente statica, sembra che sarebbe restrizione scomodo per richiedere un'istanza del tipo, al fine di richiamare la funzione di allocazione membro . Sembra che richiederebbe anche una sintassi diversa poiché il compilatore dovrebbe sapere quale istanza utilizzare che renderebbe le cose disordinate.

Il fatto che le funzioni di allocazione membro sono implicitamente static è coperto nella sezione 12.5negozio libero:

Qualsiasi funzione di allocazione per una classe T è un membro statico (anche se non esplicitamente dichiarato statico).

1

Tutti gli operatori sono impliciti. Non è necessario utilizzare l'operatore di ambito per tutti gli altri operatori.

Pensate a quanto fastidioso sarebbe:

int a = 4 int::operator* 6; 

E questo è esattamente il motivo hanno fatto in questo modo.

E inoltre, tutti gli operatori vengono analizzati nell'elaborazione lessicale del codice. Il significato di quei letterali può essere definito dall'utente:

Sezione 2.14.8 discute le regole letterali:

A definito dall'utente-letterale è trattata come una chiamata ad un operatore letterale o modello dell'operatore letterale (13.5.8). Per determinare la forma di questa chiamata per un dato L letterale definito dall'utente con suffisso X, l'identificatore del suffisso letterale è identificato da Xnel contesto di L utilizzando le regole per non qualificato ricerca del nome (3.4.1). Sia S l'insieme di dichiarazioni trovate da questa ricerca. S non deve essere vuoto.

Problemi correlati