Qual è la regola " come se "?
La regola " come se " definisce fondamentalmente quali trasformazioni un'implementazione è autorizzata a eseguire su un programma C ++ legale. In breve, sono consentite tutte le trasformazioni che non influenzano il " comportamento osservabile " di un programma (vedi sotto per una definizione precisa).
L'obiettivo è dare alle implementazioni la libertà di eseguire ottimizzazioni fintanto che il comportamento del programma rimane conforme alla semantica specificata dallo standard C ++ in termini di macchina astratta.
Dove lo Standard introduce questa regola?
Lo Standard C ++ 11 introduce la regola " come se " nel Paragrafo 1.9 / 1:
Le descrizioni semantiche in questo standard internazionale definiscono una macchina astratta non deterministica parametrizzata. La presente norma internazionale non pone alcun requisito sulla struttura delle implementazioni conformi. In particolare, non hanno bisogno di copiare o emulare la struttura della macchina astratta. Piuttosto, sono necessarie implementazioni conformi per emulare (solo) il comportamento osservabile della macchina astratta come spiegato di seguito.
Inoltre, una nota esplicativa aggiunge:
Questa disposizione è talvolta chiamata regola del "come se" , perché un'implementazione è libera di ignorare qualsiasi requisito della presente norma internazionale fintanto che il risultato è come se il requisito fosse stato rispettato, per quanto è possibile determinare dal comportamento osservabile del programma. Ad esempio, un'implementazione effettiva non ha bisogno di valutare parte di un'espressione se può dedurre che il suo valore non viene utilizzato e che non vengono prodotti effetti collaterali che influenzano il comportamento osservabile del programma.
Cosa impone esattamente la regola?
Il paragrafo 1.9 / 5 specifica inoltre:
Un'implementazione conforme che esegue un programma ben formato produrrà lo stesso comportamento osservabile di una delle possibili esecuzioni dell'istanza corrispondente della macchina astratta con lo stesso programma e lo stesso input . Tuttavia, se una di tali esecuzioni contiene un'operazione indefinita, la presente norma internazionale non impone alcun requisito all'implementazione che esegue quel programma con quell'input (nemmeno per quanto riguarda le operazioni che precedono la prima operazione non definita).
Vale la pena sottolineare che questo vincolo si applica solo quando "si esegue un programma ben formato" e che i possibili risultati dell'esecuzione di un programma che contiene un comportamento indefinito non sono vincolati. Ciò è reso esplicito anche nel Paragrafo 1.9 / 4:
Alcune altre operazioni sono descritte in questo standard internazionale come non definite (ad esempio, l'effetto del tentativo di modificare un oggetto const). [Nota: questo standard internazionale non impone requisiti sul comportamento dei programmi che contengono un comportamento indefinito . —End nota]
Infine, per quanto riguarda la definizione di " comportamento osservabile ", il paragrafo 1.9 / 8 è il seguente:
I requisiti minimi per un'implementazione conforme sono:
- Gli accessi agli oggetti volatili sono valutati rigorosamente secondo le regole della macchina astratta.
- Al termine del programma, tutti i dati scritti nei file devono essere identici ad uno dei possibili risultati che avrebbe prodotto l'esecuzione del programma secondo la semantica astratta.
- Le dinamiche di input e output dei dispositivi interattivi devono avvenire in modo tale che la richiesta di output sia effettivamente fornita prima che un programma attenda l'input. Ciò che costituisce un dispositivo interattivo è definito dall'implementazione.
Questi sono collettivamente indicati come il comportamento osservabile del programma . [ Nota : corrispondenze più stringenti tra semantica astratta ed effettiva possono essere definite da ciascuna implementazione. - nota finale ]
Ci sono situazioni in cui questa regola non si applica?
Per quanto ne so, l'unica eccezione alla regola " come se " è l'elisione copia / sposta, che è consentita anche se il costruttore di copia, il costruttore di mosse o il distruttore di una classe hanno effetti collaterali. Le condizioni esatte per questo sono specificate nel Paragrafo 12.8 / 31:
Quando vengono soddisfatti determinati criteri, un'implementazione può omettere la costruzione copia / sposta di un oggetto classe, anche se il costruttore selezionato per l'operazione copia / sposta e / o il distruttore per l'oggetto hanno effetti collaterali . [...]