为什么在C++20中std::is_pod被弃用了?

122
在C++20中,std::is_pod已被弃用。 这个选择的原因是什么?我应该使用什么来代替std::is_pod来判断一个类型是否实际上是POD?

1
请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0767r1.html和http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0488r0.pdf中的US 101。 - Baum mit Augen
3
你为什么想知道一个类型是否为POD? - Marc Glisse
15
关于标准或类似这样的特性的更改并不一定意味着我想使用该功能。我在谷歌搜索时发现了“弃用”注释,只是好奇想知道为什么它被弃用了。 - skypjack
我的问题实际上是一个间接的回答:它被删除了,因为(大概)没有理由询问一个类型是否是POD。 - Marc Glisse
10
وˆ‘ن¼ڑن½؟用static_assertو‌¥ç،®ن؟‌و²،وœ‰ن؛؛触碰ه؛”该ن¸ژCن»£ç په…±ن؛«çڑ„结و‍„ن½“م€‚ - Mirko
显示剩余2条评论
1个回答

97

POD被替换为两个分类,以更细致的方式进行划分。2017年11月的C++标准会议对此进行了以下说明:

弃用“plain old data”(POD)的概念。它已被两个更细致的类型“trivial”和“standard-layout”所取代。“POD”等同于“trivial和standard layout”,但对于许多代码模式,只使用“trivial”或只使用“standard layout”的限制更为适当;为了鼓励这种精度,因此弃用了“POD”的概念。库特征is_pod也相应地被弃用。

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


6
所以,他们在一侧添加了remove_cvref,那是一个组合特质,而在另一侧他们移除了其他组合特质?这看起来很疯狂。 :-) - skypjack
12
看起来这似乎是一个琐碎的标准布局,并涉及到递归POD。递归条款是否多余?也就是说,是否保证 std::is_pod<T>{} == (std::is_trivial<T>{} && std::is_standard_layout<T>{}) - Yakk - Adam Nevraumont
6
移除POD的意义在于它不再有用。在C++中,“平凡”的组合和“标准布局”实际上并没有什么意义,而且没有理由限制接口只能使用POD而不是基于实际情况使用“平凡”或“标准布局”。相比之下,移除“cvref”具有特定含义;结果类型是一个没有修饰符的对象类型。 - Nicol Bolas
11
就我个人而言,我非常赞赏这个变化。作为一个系统软件程序员,“标准布局”才是我一直关心的问题,而要求POD没有构造函数使它们不能正确地描述我的常见“带有构造函数的结构体习惯用法”。以前我被迫称它们为“伪POD”。虽然很可爱,但当你谈论在代码中拥有伪POD时,某些动漫粉丝会觉得你很有趣。 - T.E.D.
5
type_traits 是通过作为 type 特征的特性而存在于编译时期的,因此它们全部都是编译时期的。 - Dan M.
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接