Condividi tramite


Avviso C6395

%variable% ha letture e/o scritture non sequenziate prima di C++17; la modifica dello standard del linguaggio potrebbe modificare il comportamento del codice.

Osservazioni:

C++17 ha reso più restrittivo l'ordine di valutazione di determinate espressioni. MSVC ha rispettato, che ha modificato l'ordine di valutazione per alcune espressioni. Pertanto, la modifica della versione del linguaggio potrebbe modificare il comportamento osservabile del programma. Questo controllo consente di diagnosticare alcuni dei casi in cui il significato del codice cambia a causa del cambio di versioni del linguaggio.

Nome dell'analisi del codice: EVAL_ORDER_CHANGE

Esempio

void foo(int* a, int i)
{
    a[++i] = i; // Warning: 'i' has unsequenced reads and/or writes before C++17; changing the language standard might change the behavior of the code
}

Per risolvere questo problema, separare gli effetti collaterali dal resto dell'espressione per definire l'ordine di valutazione:

void foo(int* a, int i)
{
    ++i;
    a[i] = i; // No warning.
}