草庐IT

c++ - 是否值得添加一个支持 move 的二传手?

这篇文章有点啰嗦,所以在开始之前我想弄清楚我要问的是什么:您是否已将启用move的setter添加到您的代码中并且您是否发现它值得付出努力?我发现的预期行为中有多少可能是特定于编译器的?我在这里关注的是在我设置复杂类型的属性的情况下是否值得添加启用move的setter函数。在这里,我有启用move的Bar和Foo,它有一个可以设置的Bar属性。classBar{public:Bar():_array(1000){}Bar(Barconst&other):_array(other._array){}Bar(Bar&&other):_array(std::move(other._arra

c++ - move std::thread

尝试制作简单的代码片段:std::threadthreadFoo;std::thread&&threadBar=std::thread(threadFunction);threadFoo=threadBar;//thread&operator=(thread&&other);expectedtobecalled出现错误:useofdeletedfunction'std::thread&std::thread::operator=(conststd::thread&)'我将threadBar明确定义为右值引用,而不是普通引用。为什么不调用预期的运算符(operator)?如何将一个线程m

c++ - 纯虚函数会阻止隐式生成的 move 构造函数吗?

#includestructtest{virtualvoidfoo()noexcept=0;};structtest2:test{voidfoo()noexceptoverridefinal{}};//failsstatic_assert(std::is_move_constructible::value,"testnotmoveconstructible");//succeedsstatic_assert(std::is_move_constructible::value,"test2notmoveconstructible");(Live)根据cppreference.com(据我

c++ - 为什么我不能 std::move std::unique_ptrs between std::sets?

我真的很想将一些unique_ptr从一个std::setmove到另一个:#include#include#includeintmain(){std::set>a;std::set>b;a.insert({0,std::unique_ptr(newint(42))});std::move(a.begin(),a.end(),std::inserter(b,b.end()));}但是,我在CentOS7上的GCC4.8.5显然不满意:[root@localhost~]#g++test.cpp-std=c++11-otestInfileincludedfrom/usr/include/c

c++ - 何时使用 move 构造函数/赋值

我搜索过但找不到“何时”使用它们的答案。我一直听说它很好,因为它为我节省了额外的拷贝。我到处把它放在我上过的每个类(class)中,但有些人似乎对某些类(class)没有意义:我已经阅读了无数关于LValues和RValues以及std::movevs.std::copyvs.memcpy的教程与memmove等。甚至阅读throw()但我也不确定何时使用它。我的代码如下:structPoint{intX,Y;Point();Point(intx,inty);~Point();//Allmyotheroperatorshere..};然后我有一个类数组(类似RAII的东西):class

c++ - 是否存在与 `std::move`相反的强制转换(或标准函数)

首先,这个问题不是Functiondualtostd::move?或Doestheinverseofstd::moveexist?的重复。我不是在问一种机制,以防止在原本会发生的情况下发生移动,而是进行复制;而是我要问的是一种机制,该机制使将要绑定(bind)到可修改的左值引用的位置中的右值被接受。实际上,这与发明了std::move的情况恰好相反(即,在要绑定(bind)到(可修改的)右值引用的位置中接受了可修改的左值)。在我感兴趣的情况下,将不会接受右值,因为上下文需要可修改的左值引用。由于某些原因,我不太了解,但我愿意接受,一个(可修改的)右值表达式将绑定(bind)到一个常量左

c++ - 为什么需要 std::move 来调用 std::vector 的 move 赋值运算符

我正在学习C++11,我有一个关于move语义和右值引用的问题。我的示例代码如下(C++ShellURL是cpp.sh/8gt):#include#includevoidaaa(std::vector&&a){std::coutv;v=a;/*std::move(a)*/std::coutfoo(3,0);aaa(std::move(foo));return0;}结果是:sizeofabeforemove:3sizeofaaftermove:3std::vector的move赋值运算符似乎没有在aaa函数的v=a行调用,否则a会大小为0而不是3。但是,如果我将v=a更改为v=std::

c++ - std::move 操作 C++

AnthonyWilliams书中的台词:Thefollowingexampleshowstheuseofstd::movetotransferownershipofadynamicobjectintoathread:voidprocess_big_object(std::unique_ptr);std::unique_ptrp(newbig_object);p->prepare_data(42);std::threadt(process_big_object,std::move(p));Byspecifyingstd::move(p)inthestd::threadconstruct

c++ - move : what does it take?

使用std::string的move赋值运算符(在VC11中)需要什么?我希望它会自动使用,因为在赋值后不再需要v。在这种情况下是否需要std::move?如果是这样,我还不如使用非C++11交换。#includestructuser_t{voidset_name(std::stringv){name_=v;//swap(name_,v);//name_=std::move(v);}std::stringname_;};intmain(){user_tu;u.set_name("Olaf");return0;} 最佳答案 Ihope

c++ - std::move 未明确使用时,c++11 何时会自动执行 move ?

如果我有一个struct,其中我没有提供任何复制和move构造函数:structMyStruct{MyStruct(){//thisistheonlyfunction...}...};然后如果我执行以下操作:std::vectorvec;...vec.push_back(MyStruct());而不是像下面这样使用std::move():vec.push_back(std::move(MyStruct()));c++11会巧妙地move我的临时变量吗?或者,如何确定它是move而不是复制? 最佳答案 在C++11中,std::vec