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

sky*_*ack 69 c++ type-traits

std::is_pod可能会在C++ 20中弃用.
这个选择的原因是什么?我应该用什么来代替std::is_pod知道某种类型是否真的是POD?

D.J*_*omp 51

POD正在被两个带来更多细微差别的类别所取代.2017年11月举行c ++标准会议有这样的说法:

弃用"普通旧数据"(POD)的概念.它已被两个更细微的类型替换,"琐碎"和"标准布局"."POD"相当于"琐碎和标准的布局",但对于许多代码模式,对"琐碎"或"标准布局"的狭窄限制是合适的; 为了鼓励这种精确性,"POD"的概念因此被弃用.库特征is_pod也相应地被弃用了.

对于简单数据类型,使用该is_standard_layout函数,对于简单数据类型(如简单结构)使用该is_trivial函数.

  • 它似乎是微不足道的标准布局和涉及递归POD的子句.递归子句是多余的吗?即,是否保证`std :: is_pod <T> {} ==(std :: is_trivial <T> {} && std :: is_standard_layout <T> {})`? (6认同)
  • 我真的很感激这种变化.作为一个系统软件程序员,"标准布局"确实是我一直关心的问题,并且对没有构造函数的POD的要求使得它们没有正确地描述我常见的"构造函数结构"成语.以前我被迫称之为"伪POD".可爱,但是当你谈到在你的代码中使用伪足时,它会使某些动漫迷对你很有趣. (4认同)
  • @PasserBy但是,它是包含`std :: move`实用程序的库的一部分,该实用程序不会移动任何东西.你知道,有很多东西可以在一天结束时辩论...... ;-) (3认同)
  • @SJHowe type_traits 都是编译时,因为它们是 __type__ 的特征(仅在编译时才真正存在)。 (3认同)
  • 那么,他们在一侧添加`remove_cvref`,这是一个组合特征,而在另一侧,它们删除了其他组合特征?好像疯了 :-) (2认同)
  • @skypjack 有人可能会说 pod 是一个误导性的或经常被误用的术语 (2认同)
  • @skypjack:删除POD的重点在于它不再有用."琐碎"和"标准布局"的构成实际上并不意味着C++中的任何内容,并且根据您实际执行的操作,没有理由将接口限制为POD而不是"琐碎"或"标准布局"用它.相比之下,删除"cvref"意味着什么; 结果类型是没有限定符的对象类型. (2认同)
  • std :: is_pod,std :: is_trivia和std :: is_standard_layout是否可以编译?因为在算法中,如果C布局兼容,您可能希望使用memcpy()等更快的算法。 (2认同)