C ++ 20에서는 POD의 개념이 더 이상 사용되지 않습니다. 사소하고 표준적인 레이아웃이라는 의미없는 복합적인 특성이기 때문입니다. 그러나 C ++ 20 드래프트에서 POD의 정의는 정확히 “사소하고 표준적인 레이아웃”이 아닙니다. 실제로는 다음과 같습니다.
POD 클래스는 사소한 클래스 및 표준 레이아웃 클래스이며 비 -POD 클래스 (또는 그 배열) 유형의 비 정적 데이터 멤버가 없습니다. POD 유형은 스칼라 유형, POD 클래스, 해당 유형의 배열 또는 이러한 유형 중 하나의 cv 규정 버전입니다.
다시 말해, POD 유형은 사소한 레이아웃과 표준 레이아웃 일뿐 아니라 재귀 적으로도 마찬가지입니다.
이 재귀 요구 사항이 중복입니까? 즉, 유형이 사소하고 표준 레이아웃 인 경우 자동으로 사소하고 표준 레이아웃도 자동입니까? 대답이 “아니오”인 경우 POD가 아닌 표준 레이아웃의 사소한 유형의 예는 무엇입니까?
답변
C ++ 20에서는 POD의 개념이 더 이상 사용되지 않습니다. 사소하고 표준적인 레이아웃이라는 의미없는 복합적인 특성이기 때문입니다.
잘못되었습니다. POD라는 용어는 더 이상 중요하지 않기 때문에 더 이상 사용 되지 않습니다 .
POD라는 용어는 더 이상 표준에서 목적을 제공하지 않으며 단지 정의되어 있으며 다른 유형이이 흔적 속성을 보존 할 때 제한이 적용됩니다.
본질적으로 사소한 레이아웃과 표준 레이아웃은 사소한 것이나 표준 레이아웃이 자체적으로 제공하는 것 이상의 능력을 얻지 못합니다. 이 두 가지의 조합은 유형을 특별하게 만들지 않으며 두 속성은 실제로 서로 관련이 없습니다.
표준 레이아웃은 비어 있지 않은 하위 객체의 레이아웃이 잘 정의되어있는 것입니다 (빈 레이아웃의 하위 기본 객체는 유형의 레이아웃을 방해하지 않습니다). 사소함은 객체가 저장하는 비트 블록 이외의 의미를 갖는지 여부와 임의의 비트 블록으로 초기화 된 경우 개념적으로 유효한 객체인지 여부에 관한 것입니다.
type을 사용하는 템플릿을 만들 때 해당 유형의 객체를 T
사용할 수 있는지 확인하려면 memcpy
멤버의 레이아웃에 신경 쓰지 않습니다. TriviallyCopyable인지 알고 싶습니다. 마찬가지로 offsetof
클래스에 사용자 제공 복사 생성자가있는 경우 정확성이 가장 중요하지 않습니다. 중요한 것은 멤버 하위 객체의 레이아웃이 명확한 표준 적용 순서로 발생하는지입니다.
기본적으로 사람들은 주변을 둘러 보았고 C ++ 에는 사소함과 표준 레이아웃 의 교차 가 필요한 것은 아무것도 없다는 것을 깨달았습니다 . 따라서 기간을 예약 할 필요가 없습니다. 표준에서 명시 적으로 일부 유형이 “POD”라고 명시한 소수의 장소는 적절하게 “사소한 표준 레이아웃”으로 간단히 대체 할 수 있습니다.
이 재귀 요구 사항이 중복입니까?
두 구성 요소 요구 사항은 개별적으로 재귀 적이므로 두 요소의 교집합도 재귀 적입니다. 따라서 모든 하위 오브젝트도 POD라고 명시 적으로 지정할 필요가 없습니다. 원래의 정의는 “정적이 아닌 모든 데이터 멤버는 POD 유형이어야합니다.”와 같은 내용을 말하고 그대로 그대로 그대로 유지했습니다.
답변
표준 레이아웃은 비 정적 멤버의 표준 레이아웃에 따라 다릅니다.
[class.prop]
클래스 S는 다음과 같은 경우 표준 레이아웃 클래스입니다.
비표준 레이아웃 클래스 유형 (또는 이러한 유형의 배열) 또는 참조의 비 정적 데이터 멤버가 없습니다.
…
사소함은 또한 비 정적 구성원의 사소함에 의존합니다. 간결성을 위해 기본 생성자에 대한 규칙 만 인용했지만 다른 특수 멤버 함수에는 비슷한 단어가 있습니다.
[class.default.ctor]
사용자가 제공하지 않고 다음과 같은 경우 기본 생성자는 사소합니다.
- …
- 클래스 유형 (또는 그 배열) 인 클래스의 모든 비 정적 데이터 멤버에 대해 이러한 각 클래스는 사소한 소멸자를 갖습니다.
내가 알 수있는 한, 회원에게 적용하는 PODness의 명시 적 요구 사항은 중복 적입니다. 표준 레이아웃 및 사소한 요구 사항도 암시 적으로 따르기 때문입니다.