【问题标题】:is a trivially copyable ::std::tuple-like class template possible? Does an implementation exist?可以简单复制 ::std::tuple 类模板吗?是否存在实现?
【发布时间】:2017-01-06 20:30:49
【问题描述】:

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

【问题讨论】:

标签: c++ tuples c++14 c++17


【解决方案1】:

使用reference_wrapper 存储引用是entirely possible

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,但包含引用的类类型本身就是 TriviallyCopyable" 仅当该类以某种方式使其自身可平凡复制时才是正确的。而且我不确定在不删除复制/移动构造函数的情况下如何做到这一点。
  • @NicolBolas 标准在哪里说包含引用的类类型不可轻易复制?我在 [class.copy]/11-12 中找不到它。编辑:你不是在考虑复制分配,是吗?
  • 不过,它确实需要删除复制分配,这使得它的用处稍差。 (当然,另一种选择是重新定位;如果不使赋值运算符不平凡,就不能通过引用进行赋值。)
  • @T.C.是的,很公平。通过存储可重新安装的指针添加了引用包装/展开。
  • 一种复杂情况:tuple<X&>tuple<reference_wrapper<X>> 具有不同的复制分配语义。前者通过引用指定。后者将引用重置为引用 rhs。
【解决方案2】:

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

是的,如果一个特定的元组存储了引用类型,那么它就不会被轻易复制。但这对于 any 类型来说是正确的。如果一个类型不是普通可复制的,那么包含该类型作为子对象的类型也将不是普通可复制的。

您不能编写一个 对本身不可简单复制的类型强加简单可复制性的元组。

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

【讨论】:

  • 包含引用的元组(逻辑上)不需要存储引用(物理上)。例如,它可以包含指针,并公开引用。
  • @Yakk 我的想法完全正确。
猜你喜欢
  • 2019-04-18
  • 2019-06-15
  • 2023-03-15
  • 2019-06-12
  • 2012-01-11
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多