类型特征的基本原理检查类特殊函数的平凡性

jot*_*tik 6 c++ language-lawyer c++11 c++14 c++17

除了std::is_trivial和之外std::is_trivially_copyable,C++ 11提供了许多类型特征,用于检查类型是否具有简单的构造函数,析构函数和复制/移动赋值运算符,即:

  • std::is_trivially_constructible
  • std::is_trivially_default_constructible
  • std::is_trivially_copy_constructible
  • std::is_trivially_move_constructible
  • std::is_trivially_assignable
  • std::is_trivially_copy_assignable
  • std::is_trivially_move_assignable
  • std::is_trivially_destructible

他们最初的预期目的是什么?当然,一些C++委员会文件必须解释它们包含在C++标准库中的基本原理.

Bar*_*rry 2

为什么它们在标准库中?因为它们很有用,但无法用语言实现。


两个有用的具体例子。

  • std::is_trivially_copy_constructible- 如果我有一个vector可以简单复制构造的类型,则在重新分配时不需要单独复制每个元素。我可以memcpy()一口气走完整个街区。我们需要这种类型特征来检查这种优化何时是安全的。
  • std::is_trivially_destructible-琐碎的破坏是一个类型的重要品质。这是它成为文字类型并因此可在常量表达式中使用的标准之一。在某些情况下,我可能希望我的类型可用作文字类型,这种情况有可能发生(例如std::optional)。我们需要这种类型特征才能optional<T>有条件地轻松破坏。

  • “如果我有一个可以简单复制构造的类型的向量,那么当我进行重新分配时,我不需要单独复制每个元素。” 这需要简单的可复制性。 (5认同)