是否可以简单地复制 ::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)。
这里有几个例子:
- my own tuple implementation,表明无需特殊技巧即可轻松复制;
- a very slightly more involved implementation 表明如果您提供重新分配的可分配性(因此需要在内部使用
reference_wrapper
-类似)您仍然可以保留所有其他属性;
- a tuple with through assignability 表明您失去了平凡的可复制性,但仅限于实际包含引用类型的元组;您可以在包含标量的元组上保留微不足道的可复制性。
我需要一个简单的可复制 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)。
这里有几个例子:
- my own tuple implementation,表明无需特殊技巧即可轻松复制;
- a very slightly more involved implementation 表明如果您提供重新分配的可分配性(因此需要在内部使用
reference_wrapper
-类似)您仍然可以保留所有其他属性; - a tuple with through assignability 表明您失去了平凡的可复制性,但仅限于实际包含引用类型的元组;您可以在包含标量的元组上保留微不足道的可复制性。