Condividi tramite


Avviso del compilatore (livello 4) C4868

Il compilatore 'file(line_number)' potrebbe non applicare l'ordine di valutazione da sinistra a destra nell'elenco di inizializzatori tra parentesi graffe

Gli elementi di un elenco di inizializzatori con parentesi graffa devono essere valutati in ordine da sinistra a destra. Esistono due casi in cui il compilatore non è in grado di garantire questo ordine: il primo è quando alcuni degli elementi sono oggetti passati per valore; il secondo è quando si esegue la compilazione con /clr e alcuni degli elementi sono campi di oggetti o sono elementi di matrice. Quando il compilatore non è in grado di garantire la valutazione da sinistra a destra, genera l'avviso C4868.

Questo avviso può essere generato in seguito al lavoro di conformità del compilatore eseguito per Visual Studio 2015 Update 2. Il codice compilato prima di Visual Studio 2015 Update 2 può ora generare C4868.

Per impostazione predefinita, questo avviso non è attivo. Usare /Wall per attivare questo avviso.

Per risolvere questo avviso, valutare innanzitutto se è necessaria la valutazione da sinistra a destra degli elementi dell'elenco di inizializzatori, ad esempio quando la valutazione degli elementi potrebbe produrre effetti collaterali dipendenti dall'ordine. In molti casi, l'ordine in cui gli elementi vengono valutati non ha un effetto osservabile.

Se l'ordine di valutazione deve essere da sinistra a destra, valutare se è possibile passare gli elementi in const base al riferimento. Una modifica come questa elimina l'avviso nell'esempio di codice seguente.

Esempio

Questo esempio genera l'errore C4868 e mostra un modo per correggerlo:

// C4868.cpp
// compile with: /c /Wall
#include <cstdio>

class HasCopyConstructor
{
public:
    int x;

    HasCopyConstructor(int x): x(x) {}

    HasCopyConstructor(const HasCopyConstructor& h): x(h.x)
    {
        printf("Constructing %d\n", h.x);
    }
};

class TripWarning4868
{
public:
    // note that taking "HasCopyConstructor" parameters by-value will trigger copy-construction.
    TripWarning4868(HasCopyConstructor a, HasCopyConstructor b) {}

    // This variation will not trigger the warning:
    // TripWarning4868(const HasCopyConstructor& a, const HasCopyConstructor& b) {}
};

int main()
{
    HasCopyConstructor a{1};
    HasCopyConstructor b{2};

    // the warning will indicate the below line, the usage of the braced initializer list.
    TripWarning4868 warningOnThisLine{a, b};
};