Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.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++_Move Semantics_Typetraits - Fatal编程技术网

C++ c++;输入特征来表示“特征”;微不足道的可移动的“例子

C++ c++;输入特征来表示“特征”;微不足道的可移动的“例子,c++,move-semantics,typetraits,C++,Move Semantics,Typetraits,我将通过以下方式定义“微不足道的可移动” 调用移动构造函数(或移动赋值运算符)是 相当于memcpy将字节发送到新的目标,并且不调用 对象上的析构函数已从中移动 例如,如果您知道此属性有效,则可以使用realloc调整std::vector或内存池的大小 失败的类型通常会有指向其内容的指针,这些内容需要由move构造函数/赋值运算符更新 我在标准中找不到这样的类型特征。 我想知道这是否已经有了一个(更好的)名称,是否已经讨论过,是否有一些库利用了这种特性 编辑1: 从前面的几条评论来看,std:

我将通过以下方式定义“微不足道的可移动”

调用移动构造函数(或移动赋值运算符)是 相当于memcpy将字节发送到新的目标,并且不调用 对象上的析构函数已从中移动

例如,如果您知道此属性有效,则可以使用
realloc
调整std::vector或内存池的大小

失败的类型通常会有指向其内容的指针,这些内容需要由move构造函数/赋值运算符更新

我在标准中找不到这样的类型特征。 我想知道这是否已经有了一个(更好的)名称,是否已经讨论过,是否有一些库利用了这种特性

编辑1:


从前面的几条评论来看,
std::is_littlely_move_constructible
std::is_littlely_move_assignable
与我要找的不一样。 我相信对于包含指向自身指针的类型,他们会给出
true
,因为读取自己的成员似乎属于“琐碎”操作

编辑2:

正确实现后,指向自身的类型将不再是平凡的move\u可构造或move\u可分配的,因为move-ctor/move-assignment操作符不再是平凡的。
不过,我们应该能够说,如果我们不称其为析构函数,unique_ptr可以安全地复制到新位置。

好吧,这让我想到。。。重载包含指向自身指针的结构的类型特征非常重要

下面的代码演示了在没有正确定义type_特征的情况下,bug在代码中爬行的速度有多快

#include <memory>
#include <type_traits>

struct A
{
    int a;
    int b;
    int* p{&a};
};

int main()
{
   auto p = std::make_unique<A>();
   A a = std::move(*p.get());  // gets moved here, a.p is dangling.

   return  std::is_move_assignable<A>::value;  // <-- yet, this returns true.
}
#包括
#包括
结构A
{
INTA;
int b;
int*p{&a};
};
int main()
{
自动p=std::使_唯一();
A=std::move(*p.get());//移动到这里,A.p悬空。

return std::is_move_assignable::value;//我想你需要的是
std::is_littlely_removable
来自提案。不幸的是,提案没有进入,所以我们不应该期望它在2023年之前出现。这很遗憾,因为这种类型特性将为
std::vector
和类似类型实现极大的优化。

std::是可构造的吗?
std::是可分配的吗?似乎你所追求的还没有涵盖你想要的吗?问题是这个概念与标准中类似命名的函数所表达的不太一样,特别是关于跳过析构函数的部分。根据CPluplus.com“普通移动可构造类是一个类(使用类、结构或联合定义):使用隐式定义的移动构造函数。没有虚拟成员。其基类和非静态数据成员(如果有)本身也是普通移动可构造类型。”这意味着unique_ptr不匹配。可平凡复制似乎很合适。
memcpy
的前提是类型可平凡复制,您的自引用对象示例不可平凡复制。我猜A是不正确的,它本身是不可移动的。它可能应该删除它的move-ctor和move-assignment。是的。这意味着“读取您自己的成员”不属于也不应该属于“普通”操作…实际上不是。如果类型实现正确,它应该覆盖移动构造函数,并且不再是普通的(尝试在上面添加适当的移动构造函数,
是普通的移动构造函数
)。