草庐IT

move_disc

全部标签

c++ - Clang 模块与 std <iterator> 和 <boost/move/iterator.hpp> 交互

(有关我正在使用的特定版本的Boost和Clang的信息,请参阅问题结尾)使用新的实验性-fmodules从master/HEAD在Clang中编译功能,使用如下所示的命令行选项编译以下文件时出现构建错误:#include#include编译命令及错误:anhall@leviathan:/bin/clang++-ofile.o-cfile.cpp--std=c++1z-stdlib=libc++-fmodulesInfileincludedfromfile.cpp:2:Infileincludedfrom/usr/local/include/boost/move/iterator.hp

c++ - 为什么我不能将元素 move 到不可复制的 vector 中?

编译器告诉我我正在尝试访问已删除的函数(即lambda表达式的复制构造函数)。但我看不到在哪里。std::vector>tasks;std::packaged_tasktask{[]{return1;}};tasks.emplace_back([t=std::move(task)]()mutable{t();});(codeisalsohere)(我试图找出他们为什么在https://www.slideshare.net/GlobalLogicUkraine/c11-multithreading-futures中使用shared_ptr)。在Gcc和MSVC上我得到同样的错误-我担心我

c++ - 在RVO做不到的情况下是否应该写 `std::move`?

众所周知,std::move不应应用于函数返回值,因为它可以防止RVO(返回值优化)。我感兴趣的问题是,如果我们肯定知道RVO不会发生,我们应该怎么做。C++14标准是这么说的[12.8/32]Whenthecriteriaforelisionofacopy/moveoperationaremet,butnotforanexception-declaration,andtheobjecttobecopiedisdesignatedbyanlvalue,orwhentheexpressioninareturnstatementisa(possiblyparenthesized)id-ex

c++ - 堆分配的对象可以在堆栈上 move 吗?

问题我们可以使用move语义在堆栈上move分配给堆的对象吗?例子#include#includeclassconnection{public:connection(boost::asio::ip::tcp::socket&&socket);voidstart();private:boost::asio::ip::tcp::socketm_socket;};classserver{public://Notreleventhereprivate:voidaccept();boost::asio::io_servicem_io_service;boost::asio::ip::tcp::a

c++ - 是否有一个不会被省略的 move 构造的简单示例?

我正在尝试很好地学习move语义,以便将它介绍给我的学生。我一直在使用高度简化的类似vector或类似字符串的类来管理内存,并且其成员输出消息以演示它们的事件。我正在尝试开发一组简单的示例来向学生展示。在gcc4.7和clang中,RVO和其他地方的构造省略积极地消除了复制和move构造,所以虽然我可以很容易地看到move分配在工作,但我唯一一次看到move构造在工作是如果我关闭构造省略在带有-fno-elide-constructors的gcc4.7中。显式复制构造语句MyStringnewString(oldString);即使启用了省略,也会调用复制构造函数。但是像MyStrin

c++ - move 构造函数(和其他)的正确实现是什么?

我有一个包含std::vector的简单类,我想在按值返回类时受益于move语义(不是RVO)。我通过以下方式实现了move构造函数、复制构造函数和复制赋值运算符:classA{public://MOVE-constructor.A(A&&other):data(std::move(other.data)){}//COPY-constructor.A(constA&other):data(other.data){}//COPY-ASSIGNMENToperator.A&operator=(constA&other);{if(this!=&other){data=other.data;}

c++ - 使用 move 成本低但复制成本高的对象初始化容器的首选方法是什么

考虑下面的代码:#include#includestructC{C(){}C(constC&){std::coutg(){std::vectorret{C(),C(),C()};returnret;}std::vectorh(){std::vectorret;ret.reserve(3);ret.push_back(C());ret.push_back(C());ret.push_back(C());returnret;}intmain(){std::coutv1=g();std::coutv2=h();}编译自g++-std=c++11main.cpp&&./a.out,结果为:Te

c++ - 只提供一个 move 构造函数是不是不好的形式?

我想返回一个类型为Foo的不可复制对象从一个函数。这基本上是一个辅助对象,调用者将使用它来执行一组操作,并使用析构函数在操作完成后执行一些清理工作。出现前rvaluereferences,我会返回一个shared_ptr或类似的东西。对于右值引用,另一种选择是将构造函数和复制构造函数设为私有(private),并将唯一的公共(public)构造函数设为move构造函数。Foo看起来像这样:classFoo:boost::noncopyable{private:Foo(/*whatevertherealctorneeds*/);public:Foo(Foo&&src);//...inte

c++ - 带有参数 std::unique_ptr<T>&& 的 std::move 或 std::forward

我有以下模板类(精简后只包含相关部分)和一个名为Push的方法用C++11编写:templateclassCircularStack{private:std::array,Capacity>_stack;public:voidPush(std::unique_ptr&&value){//somecodeomittedthatupdatesan_indexmembervariable_stack[_index]=std::move(value);}}我的问题是:ShouldIbeusingstd::moveorstd::forwardwithinPush?我不确定std::unique_

c++ - 将局部变量 move 到不同类型的返回值

当从C++中的函数返回值时,我们使用复制省略和(命名)返回值优化来帮助我们创建更高效​​的代码。简而言之,如下代码:std::vectormake_vec_1(){std::vectorv;v.resize(1e6);returnv;}导致静默move或直接构造到返回值的目的地,而不是拷贝。围绕此的规则还意味着在返回时显式move返回的对象实际上会阻止这些优化。std::vectormake_vec_2(){std::vectorv;v.resize(1e6);returnstd::move(v);//BAD}此版本可防止RVO,如ScottMeyers的EffectiveModern