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

사용자가 제공한 대입 연산자/복사 생성자가 있으므로 'type'에 대한 암시적 복사 생성자/대입 연산자의 정의는 더 이상 사용되지 않습니다.

설명

C++ 표준은 일부 조건에서 복사 및 할당 연산자의 암시적 생성을 더 이상 사용되지 않지만 제거하지 않았습니다. MSVC 컴파일러는 이러한 조건에서 복사 및 할당 연산자를 계속 생성하지만 표준에서 사용되지 않는 동작을 제거하면 나중에 해당 동작이 변경될 수 있습니다. 이 경고의 목적은 위원회가 이 기능을 제거하기로 결정한 경우 코드의 향후 증명을 돕기 위한 것입니다.

C++ 표준의 관련 섹션은 다음과 같습니다.

  • class.copy.ctor 단락 6은 다음과 같습니다. "클래스 정의가 복사 생성자를 명시적으로 선언하지 않으면 nonexplicit 단락이 암시적으로 선언됩니다. 클래스 정의가 이동 생성자 또는 이동 할당 연산자를 선언하는 경우 암시적으로 선언된 복사 생성자는 삭제된 것으로 정의됩니다. 그렇지 않으면 기본값입니다. 클래스에 사용자 선언 복사 할당 연산자 또는 사용자 선언 소멸자가 있는 경우 후자의 경우는 더 이상 사용되지 않습니다."
  • "클래스에 사용자 선언 복사 할당 연산자 또는 사용자 선언 소멸자가 있는 경우 기본값으로 복사 생성자의 암시적 정의는 사용되지 않습니다. 기본값으로 복사 할당 연산자의 암시적 정의는 클래스에 사용자 선언 복사 생성자 또는 사용자 선언 소멸자가 있는 경우 더 이상 사용되지 않습니다. 이후 버전의 C++에서 이러한 암시적 정의가 삭제되도록 지정할 수 있습니다."

예시

다음 코드는 암시적으로 생성된 특수 함수가 호출되지만 명시적으로 정의되지 않은 경우 경고 C5267을 보여줍니다. /w45267 둘 다 /W4 이 경고를 생성하는 데 필요합니다.

// C5267.cpp
// compile using: /W4 /w45267
struct CopyCtorOnly
{
    CopyCtorOnly() = default;
    CopyCtorOnly(const CopyCtorOnly&) {} // C5267
};

struct CopyAssignOpOnly
{
    CopyAssignOpOnly() = default;
    CopyAssignOpOnly& operator=(const CopyAssignOpOnly&) // C5267
    {
        return *this;
    }
};

int main()
{
    CopyCtorOnly a1, a2;
    a1 = a2; // Calls deprecated copy assignment operator

    CopyAssignOpOnly b1;
    CopyAssignOpOnly b2 = b1; // Calls deprecated copy constructor
}

이 문제를 해결하려면 누락된 복사 생성자 또는 복사 할당 연산자를 명시적으로 정의합니다.

참고 항목

명시적으로 기본 설정 및 삭제된 함수