草庐IT

c++ - C++11 是否保证 return 语句中的局部变量将被 move 而不是复制?

#includeusingnamespacestd;structA{A(constvector&){}A(vector&&){}};Af(){vectorcoll;returnA{coll};//WhichconstructorofAwillbecalledasperC++11?}intmain(){f();}是coll一个xvalue在returnA{coll};?C++11是否保证A(vector&&)将在f时调用返回? 最佳答案 C++11不允许coll从中move。它只允许return中的隐式move当你做return时的陈

c++ - 为什么标准库的 move 构造函数和 move 赋值运算符会使对象处于未指定状态?

在C++标准库中有一个关于move构造函数和move赋值运算符的特殊描述,它表示从中move数据的对象在调用后处于有效但未指定的状态。为什么?坦率地说,我不明白。这是我直觉上没有预料到的。真的,如果我在现实世界中将某物从一个地方move到另一个地方,我move的地方将空(是的,有效),直到我将新东西move到那里。为什么在C++世界中它应该有所不同?例如,根据以下代码的实现:std::vectora{1,2,3};std::vectorb{4,5,6};a=std::move(b);可能等价于下一段代码:std::vectora{1,2,3};std::vectorb{4,5,6};a

c++ - 未调用 move 构造函数

在尝试编写有关move构造函数的示例后,我遇到了以下代码:#include#includeusingnamespacestd;classData{public:Data():x(3){cout为什么这里不调用move构造函数?程序打印:Data()3我发现更奇怪的是,通过添加复制构造函数,突然间,它确实调用了move构造函数...Data(constData&):x(2){cout现在它会打印Data(&&)4P.S我正在使用gcc4.4.5 最佳答案 好吧,你的代码对我来说工作正常。Seethissample.输出:Data()D

c++ - 为什么 std::move 对 std::unique_lock 没有任何影响?

我有以下C++(11)代码:#includevoidunlock(std::unique_lock&&ulock){}intmain(void){std::mutexm;std::unique_lockulock(m);unlock(std::move(ulock));if(ulock.mutex()==&m||ulock.owns_lock()){throwstd::runtime_error("");}return0;}我想不通的是为什么在unlock()返回后互斥体仍然被持有。我的期望是std::move()导致锁在从unlock()调用返回时超出范围(并被析构函数解锁).至少,

C++03 通过构造函数将 vector move 到类成员中( move 语义)

我只能访问C++03,而且我经常想像在C++11中那样将vectormove到函数中。如何做到这一点的问题不会过多地混淆代码的用户。所以我的问题是在C++11之前程序员是如何做到的。我知道可以使用交换函数“move”vector。所以这就是我想出的:classFoo{public:Foo(std::vector&vec){usingstd::swap;swap(vec,m_vec);//"move"vecintomembervector}private:std::vectorm_vec;};//usage:std::vectorv(100,1337);Foofoo(v);//v.emp

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迭代器。