2015-01-04 5 views
20

나는 자동 변수로 사용하는 내 클래스의 사용자를 방지하려는, 그래서 나는 다음과 같은 코드를 작성 :"= default"소멸자와 비어있는 소멸자의 차이점은 무엇입니까?

class A { 
private: 
    ~A() = default; 
}; 

int main() { 
    A a; 
} 

나는 코드가 컴파일되지 않을 것으로 예상하지만, g ++는 오류없이 컴파일 . 나는에 코드를 변경할 때

그러나 : 이제

class A { 
private: 
    ~A(){} 
}; 

int main() { 
    A a; 
} 

, g ++ 내 기대대로 ~A()가 개인이라는 오류가 있습니다.

"= default"소멸자와 비어있는 소멸자의 차이점은 무엇입니까?

+4

gcc의 버전은 무엇입니까? –

+1

예 : [이 소멸자 참조] (http://en.cppreference.com/w/cpp/language/destructor), 차이점은 사용자가 제공 한 소멸자 (비어있는 경우에도)가 * 사소한 것이고 * reference : "사소한 소멸자가있는 객체는 삭제 표현을 필요로하지 않고 단순히 저장 공간을 할당 해제하여 처리 할 수 ​​있습니다." –

+8

귀하의 첫 번째 예제에서 [gcc4.9 및 clang3.5 모두 컴파일을 거부] (http://coliru.stacked-crooked.com/a/41976bc03bc12c79)의 차이는 없습니다. gcc 버전의 버그 여야합니다. – Praetorian

답변

23

첫 번째 예는 컴파일하지 말아야합니다. 이것은 컴파일하는 컴파일러의 버그를 나타냅니다. 이 버그는 gcc 4.9 이후 버전에서 수정되었습니다.

= default으로 정의 된 소멸자는 입니다.이 경우에는입니다. 이는 std::is_trivially_destructible<A>::value으로 감지 할 수 있습니다.

업데이트

C++ 11 (그리고 C++ 14) 상태 하나가 사용자 선언 소멸자가있는 경우 (당신이없는 하나의 사용자 선언은 특별 회원을 이동하는 경우) , 복사 생성자 및 복사 할당 연산자의 암시 적 생성이 여전히 발생하지만 그 동작은 더 이상 사용되지 않습니다. 컴파일러가 의존한다면, 컴파일러가 비추천 경고를 줄 수도 있습니다 (그렇지 않을 수도 있음).

모두 :

~A() = default; 

과 :

~A() {}; 

사용자 선언을, 그래서 그들은이 점에 대해 차이가 없다. 이러한 양식 중 하나를 사용하고 이동 구성원을 선언하지 않으면 사용되지 않는 동작에 의존하지 않도록 명시 적으로 명시 적으로 명시 적으로 명시 적으로 삭제하거나 명시 적으로 사본 구성원을 제공해야합니다.

소멸자 선언 여부에 관계없이 멤버 이동을 선언하면 복사본 멤버가 암시 적으로 삭제됩니다.

+2

@delphifirst : 컴파일러 버그는 요즘 매우 일반적입니다. 제가 1980 년대 초반 학생이었을 때, 우리는 잘못된 행동이 컴파일러가 아닌 코드에서 버그라는 것을 알게되었습니다. 오늘은 정기적으로 컴파일러 충돌 (ICE, 내부 컴파일러 오류)을 만든 다음 누구의 잘못인지에 대해 의문의 여지가 없습니다. –

+0

@HowardHinnant : 선언되지 않은 채로 기본값에 대한 토론을 놓쳤습니다. 표준의 "사용자 선언"문구 사용과 관련이 있다고 생각합니다. in C++ 11 §12.8/18. 부디? –

+0

@ Cheersandhth.-Alf : 기꺼이 도와 드리 겠지만, 나는 당신의 질문을 이해하지 못합니다. '= defaulted' 특별 회원이 사용자 선언을하는지 묻는다면 대답은 '예'이지만 사용자는 제공하지 않습니다. –