草庐IT

move_disc

全部标签

c++ - 是否返回 std::move (x)?

是std::vectorfoo(){std::vectort;...returnt;}和std::vectorfoo(){std::vectort;...returnstd::move(t);}等价的?更准确地说,returnx是否总是等价于returnstd::move(x)? 最佳答案 它们不等价,您应该始终使用returnt;。更长的版本是,当且仅当return语句符合返回值优化条件时,returnee才会绑定(bind)到右值引用(或者通俗地说,“move是隐式的”)。但是,通过拼写returnstd::move(t);,您

c++ - 重载算术中的 move 语义和传递右值引用

我正在用C++编写一个小型数值分析库。我一直在尝试使用包括move语义在内的最新C++11特性来实现。我理解以下帖子中的讨论和最佳答案:C++11rvaluesandmovesemanticsconfusion(returnstatement),但有一种情况我仍在尝试解决。我有一个类,叫它T,它完全配备了重载运算符。我也有复制和move构造函数。T(constT&){/*initializationviacopy*/;}T(T&&){/*initializationviamove*/;}我的客户端代码大量使用运算符,因此我试图确保复杂的算术表达式从move语义中获得最大yield。考虑

c++ - 通过 mapped_type 的 r 值 move 插入映射条目

我有一个(相当)简单的键类型和复杂的映射类型的map,如下所示:map>myMap;如果我有vector手头,是否可以在复制键但move映射值的映射中插入一个条目?也就是说,有没有办法:stringkey="Key";vectormapped;for(inti=0;i 最佳答案 您正在寻找std::map::emplace:myMap.emplace(key,move(mapped));这会就地调用适当的std::pair构造函数:templatepair(U1&&x,U2&&y);由于第一个参数是左值,因此键被复制,但第二个(映射

c++ - 如何为 std::for_each 中的 lambda 捕获 std::unique_ptr "by move"

我正在学习c++11中的新功能并遇到了这个问题。我想通过将其移动到lambda中作为for_each的参数来捕获unique_ptr。设置:std::arrayarr={1,3,5,6};std::unique_ptrp(newint);(*p)=3;尝试1-不起作用,因为unique_ptr没有复制构造函数。c++0x没有指定passbymove语法。std::for_each(arr.begin(),arr.end(),[p](int&i){i+=*p;});尝试2-使用bind将p的移动拷贝绑定(bind)到采用int&的函数:std::for_each(arr.begin(),

c++ - 何时在函数调用中使用 move

这个问题在这里已经有了答案:Whatisstd::move(),andwhenshoulditbeused?(8个回答)关闭3年前。我目前正在学习有关所有c++11/14功能的更多信息,并想知道何时在函数调用中使用std::move。我知道在返回局部变量时我不应该使用它,因为这会破坏返回值优化,但我真的不明白在函数调用中强制转换为右值实际上有什么帮助。 最佳答案 当一个函数接受一个右值引用时,你必须提供一个右值(或者通过已经有一个右值,或者使用std::move创建一个xvalue)。例如voidfoo(std::string&&s

c++ - 在 std::move 之后使用对象不会导致编译错误

在对象上调用std::move后,为什么再使用该对象语言不会导致编译错误?是因为编译器无法检测到这种情况吗? 最佳答案 C++语言设计的一般原则是“信任程序员”。在对象成为std::move的参数之后,我可以想到拒绝对该对象的任何使用的一些问题。在一般情况下确定给定的使用是否是在调用std::move之后相当于解决停止问题。(换句话说,它无法完成。)您必须想出一些规则,以可以静态确定的方式描述“之后”的含义。一般来说,分配给作为std::move参数的对象是完全安全的。(一个特定的类可能会导致一个断言,但这是一个非常奇怪的设计。)编

c++ - move 语义 std::move

std::move函数我不是很懂templatetypenameremove_reference::type&&move(T&&a){returna;}为什么是remove_reference?谁能给我一个简单的解释? 最佳答案 想想如果T会发生什么是一个左值引用,例如MyClass&.在这种情况下,T&&将变为MyClass&&&,并且由于引用折叠规则,这将被转换为MyClass&再次。为了获得正确的结果,typenameremove_reference::type&&首先从类型中删除所有引用装饰,所以MyClass&映射到MyC

c++ - 为什么 std::uninitialized_move 不存在?

C++11标准库包括以下相关算法:templateForwardIteratoruninitialized_copy(InputIteratorfirst,InputIteratorlast,ForwardIteratorresult);templatevoiduninitialized_fill(ForwardIteratorfirst,ForwardIteratorlast,constT&x);templateOutputIteratorcopy(InputIteratorfirst,InputIteratorlast,OutputIteratorresult);templatev

c++ - 什么时候在 `std::move()` 函数中调用 move 构造函数?

函数std::move()定义为templatetypenamestd::remove_reference::type&&move(T&&t){returnstatic_cast::type&&>(t);}我可以想象要调用move构造函数的四个地方:参数传递时。执行类型转换时。返回结果时。不在std::move()函数本身,但可能在返回的引用最终到达的地方。我会赌4号,但我不能100%确定,所以请解释一下你的答案。 最佳答案 没有进行move构建。std::move()接受一个引用并返回一个引用。std::move()基本上只是一个

c++ - move 构造函数和多重继承

概要当类使用多重继承时,如何安全地设计move构造函数?详情考虑以下场景:structT{};structU{};structX:publicT,publicU{X(X&&other):T(std::move(other)),U(std::move(other))//alreadymoved?!{}};有没有办法安全地move构造T和U? 最佳答案 tl;dr:问题中的代码没问题。上面的代码很好,因为std::move本身实际上并没有以任何方式改变other,它只是做了一个转换来使other到右值引用中,以便调用T和U的move构造