移动语义 std::move
move semantics std::move
我不太了解std::move
函数
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
为什么remove_reference
?有人可以给我一个简单的解释吗?
考虑一下如果T
是一个左值引用会发生什么,例如 MyClass &
.在这种情况下,T &&
将变得MyClass & &&
,并且由于引用折叠规则,这将再次转换为MyClass &
。为了获得正确的结果,typename remove_reference<MyClass&>::type&&
首先从类型中删除任何引用修饰,以便将MyClass &
映射到MyClass
,然后将右值引用应用于它,从而产生MyClass &&
。
因为对左值引用的右值引用会衰减到左值引用,而重新引用的右值引用将具有与您期望从move
获得的语义不同的语义。
编辑:呵呵,为什么要投反对票?查看此代码:
template < typename T > T&& func(T&& x) { return x; }
int main()
{
int x;
int &y = func(x);
}
延伸阅读: http://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html
相关文章:
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 通过实例理解std::move及其目的
- 返回一个带有 std::move 的对象并链接函数
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- std::move a const std::vector in a lambda capture
- "std::forward"和"std::move"真的不生成代码吗?
- std::vector move 而不是交换到空 vector 并释放存储
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?
- 如何在没有 std::move 的情况下移动临时对象
- 关于在成员重载中使用 std::move() 的问题
- 显式清除 std::move 之后的源资源
- std::move(key) 同时迭代unordered_map<字符串,字符串>?
- std::move(std::array) g++ vs visual-c++
- 使用 move std::string 的 .data() 成员不适用于小字符串?
- std::move(std::unique_ptr()) 组合是否有标准缩写