2011-08-29 3 views
8

저는 C++ 11의 새로운 기능을보고 있었는데 현실 세계에서 사용할 수있는 방법을 찾지 못해서 저를 혼란스럽게합니다.삭제 및 기본값 함수 실제 세계의 예

기능이 삭제되거나 기본값으로 설정된 사람은 누구나 실제 사용 예제를 사용합니까 아니면 그냥 설탕을 첨가하는 기능 중 하나입니까?

답변

8
struct A 
{ 
    A(const A& arg) : data(arg.data) 
    { 
    do_something_special(); 
    } 

    // by writing copy constructor, we suppress the generation of 
    // implicit default constructor A::A() 

    int data; 
}; 

void foo1() 
{ 
    A a; // does not work, since there's no default constructor 
} 

이의 우리의 기본 생성자가 특별한 일을하고 (자세한 이하) 동일하지 않음을 가정 해 봅시다 컴파일러가 생성 한. 우리는, 또는 = default 구문을 사용하여 하나가 우리 자신의 기본 생성자를 (우리의 클래스는 많은 비 정적 멤버가있는 경우 지루한 얻을 수있는) 작성하여 문제를 해결할 수 있습니다 기능을 삭제

struct A 
{ 
    A() = default; 
    A(const A& arg) : data(arg.data) 
    { 
    do_something_special(); 
    } 

    int data; 
}; 

유용 때를 특정 과부하 또는 템플릿 전문화를 사용하거나 객체 복사 (또는 이동)를 금지하려는 경우.

void foo(char c) {} 
void foo(int i) = delete; // do not allow implicit int -> char conversion 

당신이 복사 (즉, 스레드 객체)를 금지 할

는 일반적인 관용적 인 방법 (예, 또는 부스트 :: noncopyable 사용) 구현하지 않고 개인 복사 생성자를 선언하는 것입니다. 이 방법이 대부분의 경우에 효과적이지만 가끔씩 애매한 링커 오류가 발생할 수 있습니다. 고려 : A(const A&) 삭제 만들기

struct A 
{ 
    A() = default; 

    friend void foo(); 

private: 
    A(const A&); 
}; 

void foo() 
{ 
    A a; 
    A b(a); // results in linker error in gcc 
} 

, 우리는 잠재적 인 링커 오류를 방지하고 우리의 의도 (복사 허용) 아주 명확합니다.

9

사용자가 선언 한 특수 회원 기능은 사소하지 않습니다. 클래스에 특별한 멤버 함수가 없으면 클래스는 POD가 아닙니다. 따라서이 유형은 POD입니다 :

struct S { 
    S() = default; 
    S(int) { } 
}; 

그러나이 유형은 POD되지 않습니다 :

struct S { 
    S() { } 
    S(int) { } 
}; 
+0

@Christian의 예는 여기를 참조하십시오 : 우리는 단순히'구조체 S {S (int)를 {}}이 있다면,'S (INT)'의 존재를'것 암시 적으로 선언 된 기본 생성자를 표시하지 않습니다. –

+0

POD에 대한 규칙은 C++ 0x/11에서 완화되어 두 번째 예제도 C++ 0x/11의 POD가됩니다. 새 특성 인 :: is_pod를 사용하여 예를 들어 정적 어설 션으로 자신을 확인할 수도 있습니다. – David

+0

@David : POD에 대한 규칙은 실제로 완화되었지만 두 번째 'S'는 여전히 POD가 아닙니다. POD 구조체는 사소한 클래스 여야합니다. 간단한 클래스에는 간단한 기본 생성자가 있어야합니다. 사용자 제공 기본 생성자는 사소하지 않습니다. 두 번째'S'는 사용자 제공 기본 생성자를 가지므로 POD가 아닙니다. –

1

복사 또는 직접 인스턴스화를 방지하려는 클래스 (예 : get_instance() 함수를 대신 수행하려는 곳의 싱글 톤)에 대해 삭제 된 함수를 사용합니다. 추위 또한 생성자의 특정 변형을 방지하기 위해 삭제를 사용합니다.

기본값은 암시 적으로 생성 된 컴파일러 생성자를 컴파일러에서 생성하려는 경우 유용합니다. 예를 들어, 사용자 정의 인수 생성자를 작성하는 경우, 디폴트 인수는 컴파일러에 의해 생성되지 않으므로 기본 키워드로 생성되도록 요청할 수 있습니다.

http://www2.research.att.com/~bs/C++0xFAQ.html#default