Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可移动但不可复制_C++_C++11_C++14_Typetraits - Fatal编程技术网

C++ 可移动但不可复制

C++ 可移动但不可复制,c++,c++11,c++14,typetraits,C++,C++11,C++14,Typetraits,是否可以创建类类型,即: 轻微移动可构造,但不轻微复制可构造,但仍然复制可构造 平凡地复制可构造,但不平凡地移动可构造,但仍然移动可构造 琐碎的复制可分配,但不琐碎的移动可分配,但仍然移动可分配 琐碎的移动可分配,但不琐碎的复制可分配,但仍然复制可分配 可构造的普通复制/移动,但不可分配的普通复制/移动,但仍可分配的复制/移动,反之亦然 等,如果有的话 ? 他们会是什么样子 这个问题对于开发类似std::variant或类似std::tuple的类是有意义的 这个问题是经过仔细研究后提出的 对

是否可以创建类类型,即:

轻微移动可构造,但不轻微复制可构造,但仍然复制可构造 平凡地复制可构造,但不平凡地移动可构造,但仍然移动可构造 琐碎的复制可分配,但不琐碎的移动可分配,但仍然移动可分配 琐碎的移动可分配,但不琐碎的复制可分配,但仍然复制可分配 可构造的普通复制/移动,但不可分配的普通复制/移动,但仍可分配的复制/移动,反之亦然 等,如果有的话 ?

他们会是什么样子

这个问题对于开发类似std::variant或类似std::tuple的类是有意义的

这个问题是经过仔细研究后提出的

对 对 对 对 5号你需要更清楚

除其他事项外,琐碎的手段不是用户提供的。因此,简单地显式地编写默认实现需要从琐碎到非琐碎的东西

可复制

对 对 对 对 5号你需要更清楚

除其他事项外,琐碎的手段不是用户提供的。因此,简单地显式地编写默认实现需要从琐碎到非琐碎的东西

可复制


回答我认为是你问题的核心:

这个问题对于开发std::variant like或 类元组类

这里关注的类类型有三种,即

所有者类型 常规类型 其他类型的函数、互斥体 在下面的示例中,假设移动/复制都有赋值后缀和构造后缀。我将把非平凡操作称为克隆-:

所有者类型:这些是可移动和可克隆的深度副本或浅层副本 典型的例子有std::unique\u ptr、std::shared\u ptr

常规字体:可移动、可复制。 典型的例子是int,std::vector。 关于这些类型的更多细节可以在编程元素中找到

其他类型函数、互斥体等:这些类型拒绝放入上述干净类中,例如函数可能引用指针、带有捕获的lambda等

就所有其他可复制/可移动的组合而言,虽然您可以创建此类类,但我认为它们更像是好奇,而不是任何有用场景中都会看到的东西


我将std::vector放在常规类型而不是所有者类型中,尽管std::vector管理内存,因为它的接口设计为尽可能接近常规类型。通常可以为表面上不规则的类型设计规则接口。在这种情况下,如果使用常规界面,对代码进行推理会更容易。

要回答我认为是您问题的核心:

这个问题对于开发std::variant like或 类元组类

这里关注的类类型有三种,即

所有者类型 常规类型 其他类型的函数、互斥体 在下面的示例中,假设移动/复制都有赋值后缀和构造后缀。我将把非平凡操作称为克隆-:

所有者类型:这些是可移动和可克隆的深度副本或浅层副本 典型的例子有std::unique\u ptr、std::shared\u ptr

常规字体:可移动、可复制。 典型的例子是int,std::vector。 关于这些类型的更多细节可以在编程元素中找到

其他类型函数、互斥体等:这些类型拒绝放入上述干净类中,例如函数可能引用指针、带有捕获的lambda等

就所有其他可复制/可移动的组合而言,虽然您可以创建此类类,但我认为它们更像是好奇,而不是任何有用场景中都会看到的东西


我将std::vector放在常规类型而不是所有者类型中,尽管std::vector管理内存,因为它的接口设计为尽可能接近常规类型。通常可以为表面上不规则的类型设计规则接口。在这种情况下,如果使用常规界面,对代码进行推理会更容易。

您认为如何?在要求他人为你做工作之前,你应该付出一些努力。此外,以下是定义:@xaxxon有时问题的表述本身就是一件大事。牛顿关于引力和其他许多问题。你在说什么?你认为呢?在要求他人为你做工作之前,你应该付出一些努力。此外,以下是定义:@xaxxon有时问题的表述本身就是一件大事。牛顿关于引力和其他许多问题。你在说什么?它回答了你的问题。也许你是想问别的问题?@这句话的最后一句
请正确回答您的问题:普通移动/复制构造函数/赋值的要求是相同的,因此您只需提供一个用户,使其成为非普通用户,并使其他用户保持普通。@Orient xannon的意思是,您可以通过执行以下操作来复制Uconst U&=默认值的行为,例如,Uconst U&U:a1_.a1_,a2_.a2{,在不更改其行为的情况下,让复制构造函数由用户提供,它具有标准为隐式定义或默认复制构造函数定义的行为,即所谓的默认实现。@Orient我不明白你的意思-只要你让复制构造函数由用户提供,即使它的行为与我的示例中隐式定义的复制构造函数相同,该类也不是可以复制构造的。-1绝对错误。非用户提供并不意味着简单的可复制性。琐碎的可复制意味着可记忆。它回答了你的问题。也许你是想问别的问题?@这个答案的最后一句话完美地回答了你的问题:对于简单的移动/复制构造函数/赋值的要求是相同的,因此,您只需提供一个用户,使其不平凡,并使其他用户平凡。@Orient xannon的意思是,您可以通过执行以下操作来复制Uconst U&=default的行为,例如,Uconst U&U:a1_.a1_,a2_.a2{,在不更改其行为的情况下,让复制构造函数由用户提供,它具有标准为隐式定义或默认复制构造函数定义的行为,即所谓的默认实现。@Orient我不明白你的意思-只要你让复制构造函数由用户提供,即使它的行为与我的示例中隐式定义的复制构造函数相同,该类也不是可以复制构造的。-1绝对错误。非用户提供并不意味着简单的可复制性。琐碎的可复制意味着可记忆。