草庐IT

moving-average

全部标签

c++ - move_iterator 是做什么用的

如果我理解正确,a=std::move(b)将引用a绑定(bind)到b的地址。而且这个操作之后b指向的内容是不保证的。move_iterator的实现here有这条线autooperator[](difference_typen)const->decltype(std::move(current[n])){returnstd::move(current[n]);}但是,我认为std::move数组中的元素没有意义。如果a=std::move(b[n])会发生什么?下面的例子也让我很困惑:std::stringconcat=std::accumulate(std::move_itera

c++ - 什么时候隐式 move 构造函数不够好?

什么时候隐式move构造函数不够好?我是否应该将它视为析构函数和复制构造函数,通常只有在我管理自己的内存时才需要它?在这个(非常做作的)场景中,隐式move构造函数是否足够好:classA{private:Bb;std::stringname;public:A();std::stringgetName()const{returnname;}BgetB()const{returnb;}};classB{private:std::vectorlist;public:B();std::vectorgetList()const{returnlist;}}; 最佳答案

c++ - std::move(*this) 是一个好的模式吗?

为了使这个带有C++11引用限定符的代码按预期工作,我必须引入一个听起来不正确的std::move(*this)。#includestructA{voidgun()const&{std::cout这听起来有些不对劲。std::move有必要吗?这是推荐的用途吗?目前,如果我不使用它,我在这两种情况下都会得到gunconst&,这不是预期的结果。(似乎*this始终是隐式和左值引用,这是有道理的,但这是使用move的唯一方法)使用clang3.4和gcc4.8.3测试。编辑:这是我从@hvd的回答中了解到的:std::move(*this)在语法和概念上都是正确的但是,如果gun不是所需

c++ - move 语义 == 自定义交换功能已过时?

最近,manyquestionspopup关于如何提供自己的swap功能。在C++11中,std::swap将使用std::move并move语义以尽可能快地交换给定值。当然,这仅在您提供move构造函数和move赋值运算符(或使用按值传递的运算符)时才有效。现在,鉴于此,是否真的有必要在C++11中编写自己的swap函数?我只能想到不可move的类型,但话又说回来,自定义swap通常通过某种“指针交换”(又名move)来工作。也许有某些引用变量?嗯…… 最佳答案 这是一个判断的问题。我通常会让std::swap完成原型(proto

c++ - std::array 是可 move 的吗?

std::array可以move吗?在BjarneNative2012presentationslides(幻灯片41)它将std::array列为唯一不可move的容器之一。快速浏览gcc4.8库源代码似乎可以确认std::array是不可move的:std::vector:/*@brief%Vectormoveconstructor....*/vector(vector&&__x)noexcept:_Base(std::move(__x)){}而在std::array中,唯一接收右值引用参数的方法是随机元素访问,它避免了复制返回:get(array&&__arr)noexcept{

c++ - 既然我们已经有了 move 语义,那么专门化 std::swap 了吗?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Movesemantics==customswapfunctionobsolete?这就是std::swap在C++11中的样子:templatevoidswap(T&x,T&y){Tz=std::move(x);x=std::move(y);y=std::move(z);}我是否仍然需要为我自己的类型专门化std::swap,或者std::swap是否尽可能高效,前提是我的类定义当然是move构造函数和move赋值运算符? 最佳答案 std::swap的特

c++ - 在派生对象上 move 构造函数

如果派生对象具有move构造函数,并且基对象也具有move语义,那么从派生对象move构造函数调用基对象move构造函数的正确方法是什么?我首先尝试了最明显的事情:Derived(Derived&&rval):Base(rval){}但是,这似乎最终调用了Base对象的复制构造函数。然后我在这里明确地尝试使用std::move,如下所示:Derived(Derived&&rval):Base(std::move(rval)){}这行得通,但我很困惑为什么它是必要的。我认为std::move只是返回一个右值引用。但是由于在这个例子中rval已经是一个右值引用,所以对std::move的调

c++ - STL vector : Moving all elements of a vector

我有两个STLvectorA和B,我想清除A的所有元素并移动的所有元素>B到A然后清除B。简单地说,我想这样做:std::vectorA;std::vectorB;....A=B;B.clear();由于B可能很长,因此需要k*O(N)来执行此操作,其中k是一个常量,N是max(size_of(A),size_of(B))。我想知道是否有更有效的方法来做到这一点。我能想到的一件事是将A和B定义为指针,然后在恒定时间内复制指针并清除B。 最佳答案 使用C++11,就这么简单:A=std::move(B);现在A包含以前由B持有的元素,

c++ - 为什么 C++20 中的 std::move 不是 [[nodiscard]]?

我最近阅读了C++17中的[[nodiscard]],据我了解,这是一项新功能(按契约(Contract)设计?),它迫使您使用return值(value)。这对于像std::launder(从C++20开始没有丢弃)这样的有争议的函数是有意义的,但我想知道为什么std::move在C中没有像这样定义++17/20。你知道一个很好的理由还是因为C++20还没有最终确定? 最佳答案 自VS201715.6以来,MSVC标准库团队继续添加了数千个[[nodiscard]]实例,并报告说它取得了巨大的成功(在发现大量错误和不会产生用户投诉

c++ - 为什么 std::move 会阻止 RVO(返回值优化)?

在许多情况下,当从函数返回一个局部变量时,RVO(返回值优化)会起作用。但是,我认为显式使用std::move至少会在RVO不执行move时强制执行发生,但在可能的情况下仍会应用RVO。然而,似乎并非如此。#include"iostream"classHeavyWeight{public:HeavyWeight(){std::cout我用VC++11和GCC4.71测试了这段代码,调试和发布(-O2)配置。复制ctor永远不会被调用。movector仅在调试配置中由VC++11调用。实际上,特别是这些编译器似乎一切都很好,但据我所知,RVO是可选的。但是,如果我明确使用move:Hea