2015-05-20 11 views
5

Mentre osservavo l'associatività dell'operatore su wikipedia, ho notato che delete ha un'associatività da destra a sinistra. La fonte è citata come msdn, l'ho verificata e rientra nella priorità del gruppo 3, associatività da destra a sinistra. Così ho controllato the C++ standard (n4296)Operatore elimina associatività

5.3 espressioni unarie [expr.unary]

1) Le espressioni con unario gruppo operatori da destra a sinistra

unary-expression: 
    postfix-expression 
    ++ cast-expression 
    -- cast-expression 
    unary-operator cast-expression 
    sizeof unary-expression 
    sizeof (type-id) 
    sizeof ... (identifier) 
    alignof (type-id) 
    noexcept-expression 
    new-expression 
    delete-expression 
unary-operator: one of 
    * & + - ! ~ 

Quali implicazioni ha questo ? Che cosa ha delete alcuna associatività?

+1

delete * ++ x; Cosa succede se si ha un puntatore al puntatore prima del puntatore che si desidera eliminare? (rubato da MickLH) – Almo

risposta

6

Come diceva Barry, la precedenza è determinata dalla grammatica (e ci sono alcuni operatori che non si adattano molto bene all'idea di base di precedenza, quindi puoi solo capire veramente cosa succede completamente dalla grammatica, non una tabella di precedenza).

Anche se ignoriamo questo, tuttavia, la precedenza dell'eliminazione solo (almeno di solito) determina se un'istruzione è legale/consentita, non ciò che significa. Per dare un controesempio, con + e *, la precedenza determina che 2 * 3 + 4 restituisce 10 anziché 14 (vale a dire, la moltiplicazione ha la precedenza).

Nel caso di delete, non viene prodotto alcun valore come risultato dell'istruzione delete, quindi una dichiarazione come delete x + y; semplicemente non è consentita. Sarebbe stato analizzato come (delete x) + y;, ma dal momento che delete x non produce un valore che può essere aggiunto a qualsiasi altra cosa, il risultato è sempre vietato (e se si modifica l'operatore, ciò resterà vero).

L'associatività non ha realmente senso per delete. In particolare, l'associatività riguarda se qualcosa come: a @ b @ c verrà analizzato come (a @ b) @ c o a @ (b @ c) (dove @ è un operatore). Questo è davvero significativo solo per gli operatori che accettano due operandi. Semplicemente non c'è modo di combinare delete s in un modo che ti permetta di porre le domande a cui risponde l'associatività.

+0

Questo era quello che stavo pensando; non ha senso avere un'associatività! Mi stavo chiedendo se mi mancasse qualcosa che gli ha dato un uso. – OMGtechy

2

Lo standard C++ in genere non definisce gli operatori in termini di precedenza o associatività. Li definisce in termini di grammatica. Da [expr.delete], delete viene utilizzato in un delete-espressione che è definita come:

delete-espressione:
        :: optare deleteghisa espressione
        :: opt delete []espressione cast

Dove Cast-espressione è definito in [expr.cast]:

Cast-espressione:
        unario espressione
        (tipo-ID)ghisa espressione

E unario espressione è un insieme di cose definite [expr.unary], che sono tutte le espressioni unari (incrementi, decrementi, delete stessi s)

Vale a dire, delete *x è associativo a sinistra a destra perché (delete (*x)) è l'unico modo per analizzare tale espressione in base alla grammatica.

Questo è anche il motivo che cppreference cita la precedenza di delete dove è diretta conseguenza.Ad esempio, delete è superiore + perché in un'espressione come questa:

delete x+y 

x+y non è un unario espressione, quindi l'unico parsing legittimo della grammatica sarebbe (delete x) + y.

+2

La precedenza non è correlata all'associatività. –

+0

L'ho appena trovato nello standard, vedi l'aggiornamento – OMGtechy

1

L'associazione indica se a op b op c viene analizzato come (a op b) op c o a op (b op c).

è un operatore unario, quindi non può associare. Non ha associatività.

E delete delete x non è mai valido.