Non ha molto senso chiedersi se *&++i
abbia di per sé UB. Il deferencing non accede necessariamente al valore memorizzato (precedente o nuovo) di i
, come puoi vedere usando questa come un'espressione di inizializzazione per un riferimento. Solo se è coinvolta una conversione di rvalue (utilizzo in tale contesto) c'è qualche domanda da discutere. E poi, dato che possiamo usare il valore di ++i
, possiamo usare il valore di *&++i
con esattamente gli stessi avvertimenti di ++i
.
La domanda originale riguardava essenzialmente lo i = ++i
, che è lo stesso di i = *&++i
. Si trattava di un comportamento non definito in C++ 03, a causa del fatto che i
veniva modificato due volte tra punti di sequenza ed era ben definito in C++ 11, a causa degli effetti collaterali dell'operatore di assegnazione che veniva sequenziato dopo il calcolo dei valori della sinistra e i lati della mano destra.
È forse importante notare che i non-normative esempi in C++ 98 e standard C++ 03, non erano corretti, descrive alcuni casi di comportamento formalmente Definire il comportamento puramente specificato. Pertanto, l'intento non è stato del tutto chiaro, al contrario.Una buona regola empirica è semplicemente non affidarsi a casi oscuri della lingua, per evitarli: uno non dovrebbe necessariamente essere un avvocato linguistico per dare un senso al codice & hellip;
fonte
2015-02-11 22:36:35
In questa risposta l'esperto "Johannes Schaub - litb" commenta che pensa che sia una dichiarazione non vera. E non ottiene risposta. –
@DrewDormann James Kanze è anche molto ben informato –
'* & i' sarebbe perfettamente valido, e' ++ i' restituisce un riferimento a 'i' quindi non vedo il problema io stesso ... –