을 삭제 = 사용 =의 의미 기본) = default
D
의 생성자, 실제로는 = delete;
때 작동하도록 허용하려면?다음 코드는 잘 컴파일
답변
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
기본 생성자가 삭제 될 때이 "이 허용"이유를 물어 때
나는 말 그대로 질문을 의미 있는지 확실하지 않습니다,하지만 난 두 가지 이유를 생각할 수 :
- 이를 행동은 잘 정의되어 있으며이를 거부 할 이유가 없습니다. 불법적으로 무언가를 만들려고 할 때만 오류를 감지하는 것은 어쨌든 완료됩니다.
- 더 유연합니다.
B
을 기본 생성자로 변경하면D
에 자동으로 허용됩니다.
Is there any reason (use case) to allow = default for D's constructor, when it's actually works as = delete;?
이 =delete
대로 작동하지 않습니다. 그것은 말하려는 것만 말합니다. 컴파일러가 명시 적으로 기본 구현을 생성하도록 사용자가 명시 적으로 요구합니다.
컴파일러가 생성 한 컴파일러가 삭제 된 것을 정의해야합니다. 기본 생성자가 B
이므로 암시 적으로 삭제됩니다.
나는'= delete'이'= default'가 아니라는 것을 알고 있습니다. 그러나 particalar 경우에는 diffirence가 있습니까? 나는'= default'를'= delete'으로 바꾸면 아무런 의미가 바뀌지 않았을 것이라고 확신합니다. 내가 잘못? – alexolut
@alexolut - 함수가 삭제됩니다. 그 원인은 다르다. 장래에'B'가 디폴트 값을 얻는다면,'D'도 마찬가지입니다. 평면적으로 삭제하면 삭제되지 않습니다. 어떤 사람들은 그것이 의미 론적으로 큰 차이라고 말합니다. – StoryTeller
B
에는 기본값이 아닌 생성자가 있으며이 생성자는 기본값이없는 인수를 사용합니다.
파생 D
클래스 따라서 기본 생성자가 삭제됩니다, 기본 생성자가없는 (컴파일러가 부모 클래스의 B(int)
생성자를 호출 할 수 있습니다 D
에 대한 생성자를 생성 할 수있다.)
D() = default;
위에서 설명한대로 D
의 기본 생성자를 원한다고 말하면 기본 생성자가 삭제됩니다.
B를 변경하면 D가 자동으로 올바른 일을합니다. –
어떤 컴파일러를 사용하고 있습니까?구조체가 비어 있고 아무것도하지 않기 때문에 컴파일러가'= default'로 정의 된대로 완전히 건너 뛸 수 있습니까? –
g ++ 5.1.0'': :: D :: D() '는 기본 정의가 잘못되어서 암시 적으로 삭제됩니다 :'와'error : B :: B()'에 대한 호출에 일치하는 함수가 없습니다 –