>  기사  >  백엔드 개발  >  Visual Studio에서 컴파일러 오류 C2280: \"삭제된 함수를 참조하려고 시도하는 중\"이 발생하는 이유는 무엇입니까?

Visual Studio에서 컴파일러 오류 C2280: \"삭제된 함수를 참조하려고 시도하는 중\"이 발생하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-27 10:31:03397검색

Why Am I Getting Compiler Error C2280:

컴파일러 오류 C2280: Visual Studio에서 "삭제된 함수 참조 시도" 해결

문제

Visual Studio 2013은 다음 코드 조각을 컴파일합니다. 오류 없음:

<code class="cpp">class A {
public:
   A(){}
   A(A &amp;&amp;){}
};

int main(int, char*) {
   A a;
   new A(a);
   return 0;
}</code>

그러나 Visual Studio 2015 RC에서는 오류 C2280이 발생합니다.

1>c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &amp;)': attempting to reference a deleted function
1>  c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here

원인

C 11에서 클래스 정의가 명시적으로 선언되지 않은 경우 복사 생성자가 있는 경우 컴파일러는 암시적으로 복사 생성자를 생성합니다. 그러나 클래스가 명시적 복사 생성자를 제공하지 않고 이동 생성자 또는 이동 할당 연산자를 정의하는 경우 암시적 복사 생성자는 =delete로 정의됩니다. 이는 서로 다른 기본 클래스와 파생 클래스 간에 객체를 복사할 때 의도하지 않은 슬라이싱을 방지하는 5의 법칙을 적용하기 위한 것입니다.

해결책

C2280 오류를 해결하려면 다음과 같은 경우 복사 생성자를 명시적으로 선언해야 합니다. 클래스를 복사할 수 있기를 원합니다. 다음은 두 가지 옵션입니다.

  1. 복사 생성자를 명시적으로 정의하고 삭제합니다:

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = delete;
    };</code>
  2. 명시적으로 복사 생성자를 제공하고 기본 설정:

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = default;
       A&amp; operator=(const A&amp;) = default;
    };</code>

두 번째 접근 방식에서는 이동 할당 연산자를 명시적으로 제공하고 규칙을 따르도록 소멸자를 선언하는 것도 고려해야 합니다. 5개 중

위 내용은 Visual Studio에서 컴파일러 오류 C2280: \"삭제된 함수를 참조하려고 시도하는 중\"이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.