2017-12-27 4 views
8

을 삭제 = 사용 =의 의미 기본) = defaultD의 생성자, 실제로는 = delete; 때 작동하도록 허용하려면?다음 코드는 잘 컴파일

+0

B를 변경하면 D가 자동으로 올바른 일을합니다. –

+0

어떤 컴파일러를 사용하고 있습니까?구조체가 비어 있고 아무것도하지 않기 때문에 컴파일러가'= default'로 정의 된대로 완전히 건너 뛸 수 있습니까? –

+1

g ++ 5.1.0'': :: D :: D() '는 기본 정의가 잘못되어서 암시 적으로 삭제됩니다 :'와'error : B :: B()'에 대한 호출에 일치하는 함수가 없습니다 –

답변

11

g++ 오류에 좋은 설명을 제공 :

bla.cpp:6:5: note: ‘D::D()’ is implicitly deleted because the default definition would be ill-formed: D() = default;

기본 생성자는 D의 모든 부분을 구성하려고합니다. 필드가 없지만 초기 생성자는 B입니다. 빈 생성자가없고 int 만 있습니다. 명시 적으로 함께 B를 구성 할 int 명시하지 않는 한 D 빈 생성자가 안되며, 컴파일러는 생각하지 않습니다 -

기본 동작은 의미가 있습니다. 그렇지 않으면 D 개체가 생기고 B 생성자의 상황에 따라 B에는 정크를 포함 할 수 있습니다 (예 : 필드 초기화). B 기본 생성자가 삭제 될 때이 " 허용"이유를 물어 때

나는 말 그대로 질문을 의미 있는지 확실하지 않습니다,하지만 난 두 가지 이유를 생각할 수 :

  1. 이를 행동은 잘 정의되어 있으며이를 거부 할 이유가 없습니다. 불법적으로 무언가를 만들려고 할 때만 오류를 감지하는 것은 어쨌든 완료됩니다.
  2. 더 유연합니다. B을 기본 생성자로 변경하면 D에 자동으로 허용됩니다.
6

Is there any reason (use case) to allow = default for D's constructor, when it's actually works as = delete;?

=delete대로 작동하지 않습니다. 그것은 말하려는 것만 말합니다. 컴파일러가 명시 적으로 기본 구현을 생성하도록 사용자가 명시 적으로 요구합니다.

컴파일러가 생성 한 컴파일러가 삭제 된 것을 정의해야합니다. 기본 생성자가 B이므로 암시 적으로 삭제됩니다.

+0

나는'= delete'이'= default'가 아니라는 것을 알고 있습니다. 그러나 particalar 경우에는 diffirence가 있습니까? 나는'= default'를'= delete'으로 바꾸면 아무런 의미가 바뀌지 않았을 것이라고 확신합니다. 내가 잘못? – alexolut

+2

@alexolut - 함수가 삭제됩니다. 그 원인은 다르다. 장래에'B'가 디폴트 값을 얻는다면,'D'도 마찬가지입니다. 평면적으로 삭제하면 삭제되지 않습니다. 어떤 사람들은 그것이 의미 론적으로 큰 차이라고 말합니다. – StoryTeller

1

B에는 기본값이 아닌 생성자가 있으며이 생성자는 기본값이없는 인수를 사용합니다.

파생 D 클래스 따라서 기본 생성자가 삭제됩니다, 기본 생성자가없는 (컴파일러가 부모 클래스의 B(int) 생성자를 호출 할 수 있습니다 D에 대한 생성자를 생성 할 수있다.)

D() = default; 위에서 설명한대로 D의 기본 생성자를 원한다고 말하면 기본 생성자가 삭제됩니다.

관련 문제