可以随意移动,但不能随意复制
trivially moveable but not trivially copyable
是否可以设置class type,即:
- 平凡地移动可构造,但不是平凡地复制可构造,但仍然是复制可构造
- 平凡的复制可构造,但不是平凡的移动可构造,但仍然是移动可构造
- 平凡的复制可分配,但不是平凡的移动可分配,但仍然是移动可分配
- 平凡地移动可分配,但不是平凡地复制可分配,但仍然是复制可分配
- 平凡的copy/move-constructible,但不是平凡的copy/move-assignable,但仍然是copy/move-assignable,反之亦然
- 等(如有)
?
它们会是什么样子?
这个问题对于开发类似std::variant
或std::tuple
的类是有意义的。
这个问题是在看完这篇文章后产生的。
回答我认为是你问题的核心:
这个问题对于开发类似std::variant的or是有意义的std:: tuple-like类
这里有三种类类型值得关注:
- <
- 所有者类型/gh><
- 常规类型/gh>
- 其他类型(函数,互斥锁)
在下面的例子中,假设两者都赋值&构造后缀用于移动/复制。我将把不重要的操作称为clone-:
Owner Types:这些是Movable &可克隆(可选择深复制或浅复制)典型的例子是std::unique_ptr, std::shared_ptr
Regular Types(int-like):这些是Movable &Copy-able。典型的例子是int, std::vector。关于这些类型的更多细节可以在什么是"常规类型"中找到。在移动语义的上下文中?,《编程要素》
其他类型(函数,互斥锁等):这些类型拒绝被放入上面的一个干净的类中。函数可以引用指针、带捕获的lambda等。
当你可以创建这样的类时,我认为它们更像是稀奇古怪的东西,而不是你在任何有用的场景中都会看到的东西。我已经把std::vector放在常规类型而不是所有者类型中,即使std::vector
管理内存,因为它的接口被设计成尽可能接近常规类型。通常可以为表面上是非规则的类型设计一个规则接口。在这种情况下,如果使用常规接口,对代码进行推理会更容易。
- 对
- 对
- 对
- 对
你需要更清楚5.
琐碎意味着(除其他事项外)不是用户提供的。因此,简单地显式地编写默认实现会让一些事情变得非常重要。
http://eel.is/c + +草案/类#类!平凡地复制,
http://eel.is/c + +/草案class.copy 25 #
- 是否可以将函数导入命名空间,但不能导出它?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- C++:返回本地对象,但不能正常工作
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 用C++替换std::字符串中的一个子字符串,但不能全部替换
- 我可以在Windows(Visual C++)中读取bin文件,但不能在linux(GCC)上读取bin文件
- QProcess可以启动程序,但不能启动python(命令行)
- C++11 向量包含 2 个不同的子类,但不能同时进行
- Eclipse 中的 Makefile 项目可以运行,但不能调试,为什么?
- 可以随意移动,但不能随意复制