Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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};
};