无法理解 std::move 的实现
Can't understand the implementation of std::move
这是std::move()
的可能实现。它不完全符合标准的细节,但它非常接近:
template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{
return ( ( typename std::remove_reference<T>::type&& )Arg );
}
我不明白为什么如果我们用T&&
替换typename std::remove_reference<T>::type&&
不起作用,即
template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{
return ( (T&&) Arg );
}
问题实际上不在于移动,而在于T&&
发生的引用崩溃。
关于这个的好文章,这里和这里的问答。
我将重点介绍演员(T&&)
以及为什么这不起作用。
鉴于上面列出的参考折叠规则;
-
T& &
变得T&
-
T& &&
变得T&
-
T&& &
变得T&
-
T&& &&
变得T&&
当T
被推导出为左值引用时,问题就出现了,然后T&&
变得T& &&
折叠为T&
,给定强制转换,您只是将其投射回左值引用,并且您没有获得使移动发生
std::remove_reference<T>::type
用于删除所有引用,然后&&
添加回右值引用,从而确保进行正确的转换。
typename
用于消除成员变量上的成员类型的歧义。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 实现move构造函数如何影响返回值优化
- 无法理解 std::move 的实现
- 使用 std::move 实现"take"方法。
- 当右值不实现move时,在具有move语义的容器上实现insert()
- 在C中实现C++标准11的std::move函数
- 如何实现菱形继承的move构造函数
- 通过调用Move赋值操作符实现Move构造函数
- 使用const_cast实现move构造函数
- 双链表实现中的"Conditional jump or move depends on uninitialised value"
- 在二维数组上实现move赋值运算符
- 通过move赋值实现B=f(A)语法
- 根据move构造函数实现复制赋值操作符
- 当基类提供move语义时,派生类是否需要实现它
- 在遵循pimpl设计模式的类中实现move语义的正确方法是什么?