草庐IT

move-semantics

全部标签

c++ - 回退到复制构造函数不起作用?

我认为当我删除B中的move构造函数时,下面的代码仍然可以正常编译,因为它仍然应该使用复制构造函数来构造B对象。为什么编译器现在会提示。没有=delete它就不会调用复制构造函数,因为它不允许提供默认的move构造函数!)classB{public:B(){}~B(){}B&operator=(constB&b){std::coutcopy"copy"clang3.6的编译器输出(Livecode)main.cpp:27:7:error:calltodeletedconstructorof'B'Bb(B{});^~~~main.cpp:21:5:note:'B'hasbeenexpli

具有复制省略或 move 语义的 C++11 元组

我写了一个如下的函数:templatestd::tuple,T,T>f(){std::vectorp(1000);returnstd::make_tuple(std::move(p),10,10);}由于返回类型非常复杂,是否保证在c++11下编译器在构造结果时将应用复制省略或move语义,或者我必须明确地说出类似std::move(std::make_tuple(std::move(p),10,10))? 最佳答案 AFAIK复制省略始终是可选的。标准只是明确表示允许编译器进行此类优化,因为它改变了可观察到的行为,它并不强制执行。

c++ - 可以从 istream_iterator 制作 move_iterator 吗?

考虑以下代码:typedefistream_iteratorchar_itr;char_itreos;stringll("sometexthere");istringstreamline_in(ll);char_itrstart(line_in);move_iteratormstart(start);//!!!move_iteratormeos(eos);vectorvc(mstart,meos);上面的代码由于行(!!!)而无法编译:errorC2440:'return':cannotconvertfrom'constchar'to'char&&'但是,如果您分别用start和eos

c++ - std::thread 并在 visual studio 2013 中 move

我有一个只能move的类和一个按值获取此类对象的函数。在新线程中调用函数:voidfoo(MyClassa){}intmain(){MyClassa;std::threadt(&foo,std::move(a));}我得到一个编译器错误,因为缺少MyClass的复制构造函数(我删除了他),如果我实现他,复制构造函数就会被调用。显然这是一个错误,它在gcc中编译时没有复制构造函数。有什么解决方法吗? 最佳答案 如果方法需要a的所有权,通过堆传递它,最好是在shared_ptr中:voidfoo(std::shared_ptra){}[

c++ - 如何使 rValue 引用在 RR 获取其值的 try block 之外可用?

假设我们不想重新设计函数a_func_that_may_throw。try{T&&rr=a_func_that_may_throw();}catch(conststd::exception&e){/*Dealwiththeexceptionhere.*/}//Question:Howtoadaptthecodeabovesoastohave`rr`availablehere?抱歉没有问清楚我的问题。添加以下内容(希望)使问题更清楚。我们可以对指针这样做:T*ptr=nullptr;try{ptr=a_source_that_may_throw();}catch(conststd::ex

c++ - 不可复制和 move 构造函数

我已经使一个类的成员不可复制,但我给它一个move构造函数和赋值运算符。然而,它不会像vector一样与容器打球。classNonCopyable{public:NonCopyable(constNonCopyable&)=delete;NonCopyable&operator=(constNonCopyable&)=delete;protected:NonCopyable(){}~NonCopyable()_NOEXCEPT{}};classMember:NonCopyable{public:Member(inti):mNum(i){}~Member(){}Member(Member

c++ - 我怎么知道我使用的是复制还是 move ?

我对C++14标准库使用move语义的理解正确吗?换句话说,我可以确信我在以下程序中使用的是move而不是复制:#include#include#includeusingnamespacestd::string_literals;std::vectorgreeting(){std::vectorvs{"hello"s,"world"s};returnvs;}intmain(){std::vectors=greeting();std::cout有什么方法可以检查吗?在下面的例子中怎么样:#include#include#includeusingnamespacestd::string_l

c++ - 当从函数返回元组时,元组的参数被复制而不是 move

我对以下代码有疑问。我的编译器是MSVC++17VisualStudio15.3版,编译器选项为/std:c++14(相对于/std:c++latest),在Release模式下运行:structBar{inta;std::stringb;Bar(){std::coutfoo(){std::strings="dsdf";return{{1,s},{5,"asdf"}};}intmain(){Bara,b;std::tie(a,b)=foo();std::cout输出是:defaultdefaultdirectdirectmovebconstcopyconstcopymoveassign

c++ - 持有大量共享状态的访问者类 : best way to implement reference semantics?

这个问题大致基于使用Visitor的Boost.Graph库(BGL)-like模式来定制递归(搜索)算法。BGL按值传递访问者对象(类似于STL函数对象)和documentation州Sincethevisitorparameterispassedbyvalue,ifyourvisitorcontainsstatethenanychangestothestateduringthealgorithmwillbemadetoacopyofthevisitorobject,notthevisitorobjectpassedin.Thereforeyoumaywantthevisitorto

C++11 - 单独 move 数组(原始数组、std::array、std::vector)的每个元素?

在C++11中,move语义等等,人们可能想知道实际上可以move什么。这方面的一个例子是数组。是否可以move原始数组的每个元素,intarray1[8];intarray2[8];array1[0]=std::move(array2[0]);std::数组,std::arrayarray1;std::arrayarray2;array1[0]=std::move(array2[0]);和std::vectorsstd::vectorarray1;std::vectorarray2;array1[0]=std::move(array2[0]);个人? 最佳