컴파일러 경고(수준 4) C4868

'file(line_number)' 컴파일러는 중괄호가 있는 이니셜라이저 목록에서 왼쪽에서 오른쪽 평가 순서를 적용할 수 없습니다.

중괄호가 있는 이니셜라이저 목록의 요소는 왼쪽에서 오른쪽 순서로 평가되어야 합니다. 컴파일러가 이 순서를 보장할 수 없는 경우는 두 가지가 있습니다. 첫 번째는 요소 중 일부가 값으로 전달된 개체인 경우입니다. 두 번째는 컴파일할 /clr 때이고 일부 요소는 개체의 필드이거나 배열 요소입니다. 컴파일러가 왼쪽에서 오른쪽 평가를 보장할 수 없는 경우 경고 C4868을 내보낸다.

이 경고는 Visual Studio 2015 업데이트 2에 대해 수행된 컴파일러 규칙 작업의 결과로 생성될 수 있습니다. Visual Studio 2015 업데이트 2 이전에 컴파일된 코드는 이제 C4868을 생성할 수 있습니다.

기본적으로 이 경고는 해제되어 있습니다. 이 경고를 활성화하는 데 사용합니다 /Wall .

이 경고를 해결하려면 먼저 요소 평가에서 순서 종속 부작용을 생성할 수 있는 경우와 같이 이니셜라이저 목록 요소의 왼쪽에서 오른쪽 평가가 필요한지 여부를 고려합니다. 대부분의 경우 요소가 평가되는 순서는 관찰 가능한 효과가 없습니다.

평가 순서가 왼쪽에서 오른쪽이어야 하는 경우 대신 참조로 요소를 const 전달할 수 있는지 고려합니다. 이와 같은 변경은 다음 코드 샘플에서 경고를 제거합니다.

예시

이 샘플에서는 C4868을 생성하고 이를 해결하는 방법을 보여 줍니다.

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