是否可以简单地复制 ::std::tuple-like class 模板?是否存在实现?

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

我需要一个简单的可复制 tuple-like class,但没有合适的实现,我自己想不出一个,我认为甚至不可能。原因是引用。 ::std::tuple 可以保存引用,但普通可复制的元组可能不能,因为它可能没有 non-trivial 构造函数,并且必须在 tuple-like class 并存储引用包装器将使 tuple-like class non-trivial。我的问题在标题里。

不清楚你在讨论引用时指的是什么。

是的,如果一个特定的元组存储了引用类型,那么它就不会被简单地复制。但是 any 类型是这样。如果一个类型不可平凡复制,那么包含该类型作为子对象的类型也不可平凡复制。

你不能写一个元组,它强加对本身不可平凡复制的类型的平凡可复制性。

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

使用 reference_wrapper 存储引用是 entirely possible:

std::reference_wrapper is guaranteed to be TriviallyCopyable. (since 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,但包含引用的 class 类型本身是 TriviallyCopyable(尽管它不是 Pod、StandardLayoutType、DefaultConstructible、TriviallyDefaultConstructible 或 Trivial)。

这里有几个例子: