草庐IT

move_disc

全部标签

c++ - 使用 std::move 返回 std::vector

我有一个非常基本的问题:返回std::vector是个好主意吗?使用std::move?例如:classA{};std::vector&&func(){std::vectorv;/*fillv*/returnstd::move(v);}我应该返回std::map,std::list..等...以这种方式? 最佳答案 你声明了一个通过右值引用返回的函数——这几乎永远不应该做(如果你通过引用返回局部对象,你最终会得到一个悬空引用)。而是声明函数按值返回。这样,调用者的值将由函数返回的右值构造。返回值也将绑定(bind)到任何引用。其次,

c++ - 不能 std::move 从 lambda 捕获到 lambda 内部的函数调用,为什么?

这个问题在这里已经有了答案:Whycan'tImovethestd::unique_ptrinsidelambdainC++14?(1个回答)关闭4年前。在下面的代码中#include#include#includevoidf1(std::unique_ptr&&uptr){}voidf(std::unique_ptr&&uptr){autothread=std::thread([uptr{std::move(uptr)}](){f1(std::move(uptr));});}intmain(){return0;}无法编译lambda中对std::move的调用:[x86-64gcc8

c++ - 为什么 std::move 返回的对象不立即销毁

我测试了以下代码:#includeusingnamespacestd;classfoo{public:foo(){cout输出是:foo()statement"move(f);"done.~foo()但是,我预计:foo()~foo()statement"move(f);"done.根据函数move的源码:templateconstexprtypenamestd::remove_reference::type&&move(_Tp&&__t)noexcept{returnstatic_cast::type&&>(__t);}返回的对象是正确的值,为什么不立即销毁呢?-----------

c++ - 在 C++ 中, "_MOVE_H"有什么特别之处?

我有这样一个C++文件#ifndef_MOVE_H#define_MOVE_HclassMove{intx,y;public:Move(intinitX=0,intinitY=0):x(initX),y(initY){}intgetX(){returnx;}voidsetX(intnewX){x=newX;}intgetY(){returny;}voidsetY(intnewY){y=newY;}};#endif令我惊讶的是,#ifndef和#endif之间的所有代码都被编译器忽略了(我发誓我没有定义_MOVE_H其他任何地方),我有各种关于缺少定义的错误。我在想我做错了什么,但是当我

c++ - 为什么我们不能有 move 的迭代器?

C++11引入了一种“move”算法,它的行为类似于“复制”算法,除了它......move数据而不是复制数据。我想知道为什么委员会没有更新复制算法以使用forward代替(或者可能除此之外)。vector提供了T&的迭代器constvector提供constT&的迭代器vector&&不能提供T&&的迭代器是有原因的吗?这将允许通过使用vector的构造函数将元素从列表move到vector...这是个坏主意吗? 最佳答案 我们已经有了。使用std::make_move_iterator创建move迭代器。

c++ - std::forward vs std::move 同时将左值绑定(bind)到右值引用

这里move和forward有区别吗:voidtest(int&&val){val=4;}voidmain(){intnb;test(std::forward(nb));test(std::move(nb));std::cin.ignore();} 最佳答案 在您的具体情况下,不,没有任何区别。详细答案:在幕后,std::move(t)做static_cast::type&&>(t),其中T是t的类型(参见§20.2.3/6)。在您的情况下,它解析为static_cast(nb).forward有点棘手,因为它是为在模板中使用而量身

c++ - operator= 的模糊重载使用 move 分配和按值复制分配传递

如果我定义一个复制赋值运算符,它使用类thing的按值传递调用复制构造函数:thing&operator=(thingx){和同一个类的move赋值运算符:thing&operator=(thing&&x){尝试调用move赋值导致gcc出错:error:ambiguousoverloadfor‘operator=’(operandtypesare‘thing’and‘std::remove_reference::type{akathing}’)但是,如果复制分配改为使用引用传递:thing&operator=(thing&x){编译没问题,两个操作符都可以调用。为什么是这样?完整的C

c++ - Qt C++ : Moving a file, 源路径和目标路径在不同的驱动器上

我想在C++中将一个文件从一个文件夹(比如在驱动器C上)移动到另一个文件夹(比如在驱动器D上)。如果该文件已经存在于目标文件夹中,它应该覆盖它。如何使用C++std库或Qt实现它?我找到了“重命名”方法,但我不确定如果路径位于不同的驱动器上,它是否会起作用。另外,什么是平台依赖? 最佳答案 只需使用QFile::rename().对于大多数目的,它应该做大致正确的事情。我认为C++标准库没有文件系统间重命名调用(如果我错了,请在评论中纠正我!),std::rename只能在单个文件系统内移动。然而,通常这里唯一(相关的)原子文件操作

c++ - 通过 destruct+move 构造的 move 分配安全吗?

这里有一个非常简单的方法来为大多数带有move构造函数的类定义move赋值:classFoo{public:Foo(Foo&&foo);//youstillhavetowritethisoneFoo&operator=(Foo&&foo){if(this!=&foo){//avoiddestructingtheonlycopythis->~Foo();//callyourowndestructornew(this)Foo(std::move(foo));//callmoveconstructorviaplacementnew}return*this;}//...};在标准C++11中,

c++ - move 构造函数不能默认

我是c++11的新手并编写了以下类,我希望它支持std::move:classX{public:X(intx):x_(x){}~X(){printf("X(%d)hasbereleased.\n",x_);}X(X&&)=default;X&operator=(X&&)=default;X(constX&)=delete;X&operator=(constX&)=delete;private:intx_;};但是,当我使用选项-std=c++0x编译它时,编译器会报错如下:queue_test.cc:12:error:‘X::X(X&&)’cannotbedefaultedqueue_