Visual Studio 2013은 다음 코드 조각을 컴파일합니다. 오류 없음:
<code class="cpp">class A { public: A(){} A(A &&){} }; 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 &)': 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 오류를 해결하려면 다음과 같은 경우 복사 생성자를 명시적으로 선언해야 합니다. 클래스를 복사할 수 있기를 원합니다. 다음은 두 가지 옵션입니다.
복사 생성자를 명시적으로 정의하고 삭제합니다:
<code class="cpp">class A { public: explicit A(){} A(A &&){} A(const A&) = delete; };</code>
명시적으로 복사 생성자를 제공하고 기본 설정:
<code class="cpp">class A { public: explicit A(){} A(A &&){} A(const A&) = default; A& operator=(const A&) = default; };</code>
두 번째 접근 방식에서는 이동 할당 연산자를 명시적으로 제공하고 규칙을 따르도록 소멸자를 선언하는 것도 고려해야 합니다. 5개 중
위 내용은 Visual Studio에서 컴파일러 오류 C2280: \'삭제된 함수를 참조하려고 시도하는 중\'이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!