草庐IT

move_wrapper

全部标签

c++ - 如何根据 is_nothrow_move_constructible<T> 声明包装类型 X<T> noexcept 的移动构造函数?

假设我有一个包装类型templatestructX{/*..*/};而且我不能只是X(X&&)=default因为我必须在那里做一些重要的事情。但是,我希望它是noexcept但前提是T(T&&)是noexcept。这可以使用::std::is_nothrow_move_constructible进行测试。我不知道如何根据constexpr有条件地启用构造函数的一个版本或另一个版本。我想可能有一种使用SFINAE的方法,但我不知道如何将其应用于ctors。 最佳答案 noexcept说明符接受任何bool常量表达式,因此您可以直接检

c++ - 无论如何有一个 valgrind 消息 "Conditional jump or move depends on uninitialized value"可以是所谓的 'false positive'

我在这里找到的大多数问题都提供一段代码,并由指出实际错误的人回答。我的问题是关于一般未初始化值的条件跳转。我可以理解,如果确定此分配仅完成一次并且在程序的生命周期内可能需要,则不必在程序结束时清理一block内存。据我所知,当程序终止时,GType系统会留下大量未释放的内存。这些未释放的block可以被视为“误报”。但是“有条件的跳跃或移动未初始化的值”会是误报吗?我唯一能想出的是有人通过读取随机地址来实现(坏的)随机函数(其中随机地址本身是棘手的部分;)。另一个例子可能是硬件映射到内存的一部分然后被读取,但这主要是由驱动程序而不是由普通用户应用程序完成的。是否有任何其他示例(最好是C

c++ - 为 std::reference_wrapper 赋值

我们如何为std::reference_wrapper包装的项目赋值?inta[]={0,1,2,3,4};std::vector>v(a,a+5);v[0]=1234;//Error,cannotassignvalue!根据错误,删除了直接赋值:error:useofdeletedfunction'std::reference_wrapper::reference_wrapper(_Tp&&)[with_Tp=int]' 最佳答案 使用get()成员函数:v[0].get()=1111;//okHere是std::referenc

c++ - 为什么 std::move 需要前向引用?

std::move的实现基本上是这样的:templatetypenamestd::remove_reference::type&&move(T&&t){returnstatic_cast::type&&>(t);}请注意,std::move的参数是一个通用引用(也称为转发引用,但我们这里不转发)。也就是说,您可以std::move左值和右值:std::stringa,b,c;//...foo(std::move(a));//fine,aisanlvaluefoo(std::move(b+c));//nonsense,b+cisalreadyanrvalue但既然std::move的全部

c++ - 在这里真的有必要将 std::move 放在 lambda 中吗?

我真的必须将std::move调用封装在lambda中吗?std::listsrcData=GetData();//implementationnotimportantstd::vectordstData;dstData.reserve(srcData.size());std::transform(std::begin(srcData),std::end(srcData),std::back_inserter(dstData),[](std::wstring&guid)->std::wstring{returnstd::move(guid);});srcData.clear();我对l

c++ - 使用 std::reference_wrapper 作为 std::map 中的键

我在类层次结构中有一堆对象,我想制作一个std::map使用对这些对象的引用作为映射中的键。它看起来像std::reference_wrapper正是为此所需要的,但我似乎无法让它发挥作用。到目前为止我尝试了什么:classObject{//baseclassofmyhierarchy//mostdetailsunimportantpublicvirtualbooloperator,int>table;autoit=table.find(object);table[object]=42;table[object]++但是,我总是从编译器中得到一些模糊的错误:/usr/include/c

c++ - std::move 模板参数是如何推导出来的?

假设我们有:foo(A&&a);如果你这样做Aa;foo(a);它不会编译并且提示不能将左值绑定(bind)到A&&。很好。然而,鉴于std::move的签名,templatetypenameremove_reference::type&&std::move(T&&a);看起来它需要一个右值引用,就像在foo中一样,为什么下面的代码符合要求?Aa;std::move(a);a不是左值吗?此外,据说编译将实例化:typenameremove_reference::type&&std::move(A&&&a);我不明白为什么不是:typenameremove_reference::type

c++ - 运行 SonarQube 分析扫描 - SonarSource build-wrapper

我是运行SonarQube扫描的新手,我在Jenkins的日志中收到此错误消息:16:17:3916:17:36.926ERROR-TheonlywaytogetanaccurateanalysisofyourC/C++/Objective-CprojectisbyusingtheSonarSourcebuild-wrapper.Ifforanyreason,theuseofthebuild-wrapperisnotpossibleonyourproject,youcanbypassitwiththehelpofthe"sonar.cfamily.build-wrapper-outpu

c++ - 在 vector 中使用没有拷贝且没有 noexcept move 构造函数的对象。到底是什么坏了,我该如何确认?

我检查了很多moveconstructor/vector/noexcept线程,但我仍然不确定当事情应该出错时实际发生了什么。我无法按预期产生错误,所以要么我的小测试有误,要么我对问题的理解有误。我正在使用BufferTrio对象的vector,它定义了一个noexcept(false)move构造函数,并删除了所有其他构造函数/赋值运算符,这样就没有什么可以回退到:BufferTrio(constBufferTrio&)=delete;BufferTrio&operator=(constBufferTrio&)=delete;BufferTrio&operator=(BufferTr

c++ - move 语义和完美转发的区别

我已经从这个问题中得到了什么是move语义:Whataremovesemantics?但我仍然不明白与move语义相关的完美转发是什么。谁能用简单的英语和一个简单的例子解释一下什么是完美转发? 最佳答案 纯英语尝试这个问题可能太复杂了,无法用简单的英语句子准确描述,但可以将完美转发视为一种将传递给一个函数的临时值move到另一个函数的方法,就好像第一个函数没有完全存在,因此没有任何不必要的拷贝或分配。当您尝试获取引用(右值或左值)时,C++11允许您通过在类型的右值(&&)和左值(&)引用之间引入一些转换规则来执行此操作R值引用是C