std :: is_pod가 C ++ 20에서 더 이상 사용되지 않는 이유는 무엇입니까?


92

std::is_pod아마도 C ++ 20에서는 더 이상 사용되지 않을 것입니다.
이 선택의 이유는 무엇입니까? std::is_pod유형이 실제로 POD인지 알기 위해 대신 무엇을 사용해야 합니까?



3
유형이 POD인지 왜 알고 싶습니까?
Marc Glisse

8
@MarcGlisse 표준의 변경이나 이와 같은 특성에 대한 질문이 반드시 해당 기능을 사용하고 싶다는 의미는 아닙니다. 인터넷 검색 중에 더 이상 사용되지 않는 메모를 찾았고 왜 더 이상 사용되지 않는지 궁금했습니다.
skypjack

내 질문은 실제로 간접적 인 대답이었습니다. 유형이 POD인지 물어볼 이유가 (대략) 없기 때문에 제거되었습니다.
Marc Glisse

3
static_assert아무도 C 코드와 공유해야하는 구조체를 건드리지 않도록하기 위해 사용합니다 .
Mirko

답변:


70

POD는 더 많은 뉘앙스를 제공하는 두 가지 범주로 대체되고 있습니다. , 11 월, 2017 년 C ++ 표준 회의는 그것에 대해 말을이 있었다 :

"일반 오래된 데이터"(POD) 개념을 사용하지 않습니다. "사소한"및 "표준 레이아웃"이라는 두 가지 미묘한 범주의 유형으로 대체되었습니다. "POD"는 "사소한 표준 레이아웃"과 동일하지만 많은 코드 패턴의 경우 "사소한"또는 "표준 레이아웃"으로 더 좁은 제한이 적합합니다. 따라서 이러한 정확성을 장려하기 위해 "POD"개념은 더 이상 사용되지 않습니다. 라이브러리 특성 is_pod도 그에 따라 더 이상 사용되지 않습니다.

단순 데이터 유형의 경우 is_standard_layout함수를 사용하고 간단한 데이터 유형 (예 : 단순 구조체)의 경우 is_trivial함수를 사용하십시오 .


4
그래서, 그들은 remove_cvref한쪽에, 즉 구성된 특성 을 추가 하고 다른 쪽에서는 다른 구성된 특성을 제거합니까? 미친 것 같아요. :-)
skypjack

6
사소하고 표준적인 레이아웃과 재귀 적으로 POD를 포함하는 절인 것 같습니다. 재귀 절이 중복됩니까? 즉, 보장 std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{})됩니까?
Yakk-Adam Nevraumont

3
@skypjack : POD를 제거하는 요점은 더 이상 목적이 없다는 것입니다. "사소한"및 "표준 레이아웃"의 구성은 실제로 C ++에서 어떤 의미도 없으며 실제로 수행하는 작업을 기반으로 "사소한"또는 "표준 레이아웃"이 아닌 POD로 인터페이스를 제한 할 이유가 없습니다. 그것으로. 대조적으로 "cvref"를 제거하는 것은 무언가를 의미합니다. 결과 유형은 한정자가없는 객체 유형입니다.
Nicol Bolas

5
이 변화에 대해 정말 감사드립니다. 시스템 소프트웨어 프로그래머로서 "표준 레이아웃"은 제가 계속 신경 쓰는 부분이었고, POD에 생성자가없는 요구 사항 때문에 일반적인 "생성자가있는 구조체"관용구를 제대로 설명하지 못했습니다. 이전에는 이러한 "의사 -POD"라고 부르도록 강요 받았습니다. 귀엽지 만 코드에 의사 포드를 사용하는 것에 대해 이야기 할 때 특정 애니메이션 팬이 재미있게 보입니다.
TED

2
인가 std::is_pod, std::is_triviastd::is_standard_layout컴파일 시간은? 알고리즘에서는 C 레이아웃이 호환되는 경우 memcpy () 등을 사용하여 더 빠른 알고리즘을 원할 수 있습니다.
SJHowe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.