Partilhar via


Aviso do compilador (nível 4) C4868

O compilador 'file(line_number)' não pode impor a ordem de avaliação da esquerda para a direita na lista de inicializadores em braced

Observações

Os elementos de uma lista de inicializadores devem ser avaliados na ordem da esquerda para a direita. Há dois casos em que o compilador é incapaz de garantir essa ordem: o primeiro é quando alguns dos elementos são objetos passados por valor; o segundo é quando compilar com /clr e alguns dos elementos são campos de objetos ou são elementos de matriz. Quando o compilador não pode garantir a avaliação da esquerda para a direita, ele emite o aviso C4868.

Esse aviso pode ser gerado como resultado do trabalho de conformidade do compilador que foi feito para o Visual Studio 2015 Update 2. Código que compilado antes do Visual Studio 2015 Atualização 2 agora pode gerar C4868.

Este aviso está desativado por padrão. Use /Wall para ativar este aviso.

Para resolver esse aviso, primeiro considere se a avaliação da esquerda para a direita dos elementos da lista de inicializadores é necessária, como quando a avaliação dos elementos pode produzir efeitos colaterais dependentes da ordem. Em muitos casos, a ordem em que os elementos são avaliados não tem um efeito observável.

Se a ordem de avaliação deve ser da esquerda para a direita, considere se é possível passar os elementos por const referência. Uma alteração como essa elimina o aviso no exemplo de código a seguir.

Example

Este exemplo gera C4868 e mostra uma maneira de corrigi-lo:

// 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};
};