一个普通的可复制的::std::元组类模板可能吗?是否存在实现
is a trivially copyable ::std::tuple-like class template possible? Does an implementation exist?
我需要一个普通的可复制的元组类,但是没有合适的实现存在,我自己不能想出一个,我认为一个甚至是不可能的。原因是参考文献。::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
,表示类型列表中的所有类型都是平凡可复制的。
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么使用 NDK 不能存在不同的 stl 实现?
- C++实现代码中的字符串不应存在于输出二进制文件中.如何解决
- clang实现char8_t的方式是否存在缺陷,或者标准的某个黑暗角落是否禁止优化?
- 用较少的内存在C++中实现2d数组
- unique_ptr实现中可能存在的错误
- 来自 vtable 的未定义符号是否意味着接口和实现之间存在错误
- DCT 实现存在问题
- 是否存在无锁矢量实现
- 运算符重载实现:0xC0000005:读取位置存在访问冲突
- 是否存在具有基本反射的轻量级信号槽实现
- 如何根据插入对的存在来实现不同的“std::map insert()”行为
- c++ 98:根据成员的存在提供不同的函数实现
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- c++或库中是否存在null std::ostream实现?
- 命令设计模式的实现存在一些错误
- 一个普通的可复制的::std::元组类模板可能吗?是否存在实现
- 是否存在作为一组Clang工具实现的C++重构模式
- 我在 OpenMP 中实现 Dijkstra 最短路径算法时可能存在的范围问题?
- Lamport 面包店算法的实现存在超过 1 个线程的 seg 错误