为什么C ++ 20中不推荐使用std :: is_pod?


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

Answers:


70

POD被替换为两个类别,它们提供了更多细微差别。2017年11月c ++标准会议对此发表了看法:

不赞成“普通旧数据”(POD)的概念。它已被两个更细微的类别所取代,即“平凡的”和“标准布局”。“ POD”等效于“简单且标准的布局”,但对于许多代码模式而言,将狭义限制限制为“简单”或“标准布局”是适当的;为了鼓励这种精度,因此不赞成使用“ POD”的概念。库特征is_pod也已相应弃用。

对于简单数据类型,请使用is_standard_layout函数;对于简单数据类型(例如,简单结构),请使用is_trivial函数。


4
那么,他们remove_cvref在一侧添加了一个组合特征,而在另一侧又删除了其他组合特征?好像疯了 :-)
skypjack

6
它似乎是琐碎的AND标准布局,以及涉及递归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_podstd::is_triviastd::is_standard_layout编译时间?因为在算法中,如果C布局兼容,您可能希望使用memcpy()等更快的算法。
SJHowe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.