一个普通的可复制的::std::元组类模板可能吗?是否存在实现

is a trivially copyable ::std::tuple-like class template possible? Does an implementation exist?

本文关键字:实现 存在 是否 std 一个 可复制 元组      更新时间:2023-10-16

我需要一个普通的可复制的元组类,但是没有合适的实现存在,我自己不能想出一个,我认为一个甚至是不可能的。原因是参考文献。::std::tuple可以保存引用,但是普通的可复制元组可能不能,因为它可能没有非平凡构造函数,并且引用必须在类元组类的构造函数中初始化,并且存储引用包装器将使类元组类非平凡。我的问题在标题里

完全可以使用reference_wrapper存储引用:

std::reference_wrapper保证为TriviallyCopyable。(因为c++ 17)

只要有一个非平凡的非特殊构造函数(如std::reference_wrapper<T>::reference_wrapper(T&))就绝对没问题。所以同样适用于你的trivially_copyable_tuple;只要它有一个简单的复制构造函数,trivially_copyable_tuple::trivially_copyable_tuple(int&, float&, char)就可以。

实际上,你根本不需要使用std::reference_wrapper;虽然引用类型不是TriviallyCopyable,但包含引用的类类型本身是TriviallyCopyable(尽管它不是Pod、StandardLayoutType、DefaultConstructible、TriviallyDefaultConstructible或Trivial)。

下面是一些例子:

  • 我自己的元组实现,表明不需要特殊技巧就可以使其TriviallyCopyable;
  • 一个稍微复杂一点的实现,表明如果你提供了可重新分配的可分配性(所以需要在内部使用类似reference_wrapper的),你仍然可以保留所有其他属性;
  • 一个具有可赋值性的元组,表明你失去了微不足道的可复制性,但只有在实际包含引用类型的元组上;你可以在包含标量的元组上保留琐碎的可复制性。

当你讨论参考文献时,你不清楚你指的是什么。

是的,如果一个特定的元组存储引用类型,那么它就不会是平凡的可复制的。但是对于任何类型都是如此。如果一个类型不可普通复制,那么包含该类型作为子对象的类型也将不可普通复制。

你不能编写一个元组,其中平凡可复制性强加给本身不平凡可复制的类型。

但是,如果所有组件类型本身都是可复制的,则完全有可能编写一个可复制的元组类型。这是你能得到的最好保证。如果您想确保用户永远不会给出非平凡可复制的类型,您可以添加一个static_assert,表示类型列表中的所有类型都是平凡可复制的。