nothrow_move_constructible
全部标签 如果我有两个vector并且想将它们组合为一个,我可以通过以下方式进行:std::vectora(100);//justsomerandomsizeherestd::vectorb(100);a.insert(std::end(a),std::begin(b),std::end(b));不过,这涉及到复制,我想避免这种情况。有没有办法使用move语义将它们组合在一起?我非常怀疑它,因为vector应该是连续的。但是有没有办法用deque做到这一点? 最佳答案 是的,使用std::move:#includestd::move(b.be
structcopyable{//andmovablecopyable()=default;copyable(copyableconst&){/*...*/};copyable&operator=(copyableconst&){/*...*/return*this;}};由于复制构造函数和复制赋值操作函数是显式定义的,这意味着move构造函数和move赋值函数不能被编译器隐式定义,因此不允许move操作。请问我上面的理解是否正确? 最佳答案 itsignifiesthatmoveconstructorandmoveassignme
假设我们有以下代码:std::vectorf(){std::vectory;...returny;}std::vectorx=...x=f();似乎编译器在这里有两种方法:(a)NRVO:破坏x,然后构造f()代替x。(b)move:在临时空间中构造f(),将f()move到x中,销毁f()。根据标准,编译器可以自由使用这两种方法吗? 最佳答案 编译器可以NRVO进入临时空间,或将构造move到临时空间。从那里它会moveassignx.更新:任何时候您想使用右值引用进行优化,但您对结果不满意,请为自己创建一个跟踪其状态的示例类:构
如果我理解正确,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
什么时候隐式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++11引用限定符的代码按预期工作,我必须引入一个听起来不正确的std::move(*this)。#includestructA{voidgun()const&{std::cout这听起来有些不对劲。std::move有必要吗?这是推荐的用途吗?目前,如果我不使用它,我在这两种情况下都会得到gunconst&,这不是预期的结果。(似乎*this始终是隐式和左值引用,这是有道理的,但这是使用move的唯一方法)使用clang3.4和gcc4.8.3测试。编辑:这是我从@hvd的回答中了解到的:std::move(*this)在语法和概念上都是正确的但是,如果gun不是所需
std::nothrow的理想用法是什么? 最佳答案 我只会将它用作优化(或代码简化),否则我会在使用常规new时立即放置一个try-catchblock,捕获std::bad_alloc.这是一种非常罕见的情况,因为很少能够在调用站点有效地处理内存不足。通常你分配内存是因为你需要它,而不是因为你很想拥有它但可以没有它。将空指针传递回调用者链直到最终有人可以处理该问题的代码不是惯用的C++。虽然确实可以立即处理错误,但也有可能发生。例如,您可能会在有足够工作空间的情况下使用一种算法或技术,而没有使用另一种较慢的算法或技术。再说一次,
我有以下代码:#includeclassA;intmain(){std::cout::value当我使用GCC8.3时,此代码编译。但是,当我使用Clang8.0,我得到一个编译错误,不完整的类型不能用于类型特征。哪一个是正确的?我是否可以在不完整的类型上使用is_constructible(预期值为false),还是不允许? 最佳答案 行为未定义。[meta.unary.prop]templatestructis_constructible;TandalltypesintheparameterpackArgsshallbecomp
最近,manyquestionspopup关于如何提供自己的swap功能。在C++11中,std::swap将使用std::move并move语义以尽可能快地交换给定值。当然,这仅在您提供move构造函数和move赋值运算符(或使用按值传递的运算符)时才有效。现在,鉴于此,是否真的有必要在C++11中编写自己的swap函数?我只能想到不可move的类型,但话又说回来,自定义swap通常通过某种“指针交换”(又名move)来工作。也许有某些引用变量?嗯…… 最佳答案 这是一个判断的问题。我通常会让std::swap完成原型(proto
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{