2014-11-12 13 views
7

섹션 N3797::12.8/11 [class.copy]으로 정의 된 복사 생성자는 말한다 사례 :암시 적으로 삭제

내재적 선언 복사/이동 생성자는 클래스의 인라인 공공 회원입니다. 삭제 된 클래스 X 하는 부도 복사/이동 생성자 정의된다 (8.4.3) X가있는 경우 :

[...]

- 클래스 타입 M의 비 정적 데이터 부재 (또는 복사 될 수없는 이들 어레이)/ 이동으로 인해 과부하 해상도 (13.3), M의가 부도 생성자에서 생성자 결과 모호성 또는 삭제되는 함수 또는 액세스 대응에 적용

해당 복사/이동 생성자의 모호성에 대한 첫 번째 사례는 분명합니다. 우리는 다음과 같이 쓸 수 있습니다 :

#include <iostream> 
using namespace std; 

struct A 
{ 
    A(){ } 
    A(volatile A&){ } 
    A(const A&, int a = 6){ } 
}; 

struct U 
{ 
    U(){ }; 
    A a; 
}; 

U u; 

U t = u; 

int main(){ } 

이 반영되어 있습니다. 그러나 또는 기본 생성자에서 삭제되었거나 액세스 할 수없는 함수는 무엇입니까?? 기본 생성자에서 액세스 할 수없는 함수가있는 것은 무엇입니까? 이를 반영한 ​​사례를 제공해 주시겠습니까?

+0

기본 생성자가 아닌 * 기본 생성자 *는 기본 복사/이동 생성자를 나타냅니다. –

답변

6

단순히 입력 :

struct M { M(M const&) =delete; }; 
struct X { X(X const&) =default; M m; }; // X(X const&) is actually deleted! 

암시 적 선언 함수의 "디폴트"으로 간주된다 ([dcl.fct.def.default]/5); 더 친숙한 사전 C++ 11 예는 같은 수 있습니다 : 함수가 암시 될 경우 명시 적으로 후 기능 기본 경우가 선언 된 것을

struct M { protected: M(M const&); }; 
struct X { M m; }; // X's implicit copy constructor is deleted! 

주 프로그램이 잘못 형성된다 삭제 ([dcl.fct.def.default]/5)에 복사 할 수 없습니다

struct M { M(M const&) =delete; }; 
struct X { X(X const&); M m; }; 

X::X(X const&) =default; // Not allowed. 
+2

+1, nice [예제] (http://coliru.stacked-crooked.com/a/51ef1acf1d514c68) – Niall

+0

정말로, 고마워 .. –

0

클래스 타입 M (또는 이들의 배열)의 비 정적 데이터 부재/이동 때문에 과부하 해상도 (13.3)은 M의 해당 생성자에 적용되면 모호성 타이 또는 가장 확실 편의상, 삭제 또는 부도 생성자

문구는 아마도 약간 부자연에서 액세스 할 수있는 기능. 위의 내용에서 강조한 바와 같이, 문제의 함수 M복사 생성자에 액세스 할 수 없도록 오버로드되어 있습니다. 따라서 예를 들어 복사 생성자가 protected 인 클래스 M의 구성원은 delete 복사 생성자 X이됩니다. 마찬가지로 복사 생성자 M을 단순히 삭제하면 동일한 결과가 발생합니다.

관련 문제