为什么 std::move 使用 std::remove_reference
why std::move uses std::remove_reference?
根据 http://en.cppreference.com/w/cpp/utility/move
std::move
声明如下:
template <typename T>
std::remove_reference<T>::type&& move(T&& t);
据我了解,当代码被模板化时,typename T
中T
的推论会丢失有关引用的信息,因此:
template <typename T>
void someFunction(T&& value);
当像这样使用时:
int five=5;
someFunction(five);
然后
-
value
属于int&
类型 -
T
int
或
const float value = 5.25;
someFunction(value);
然后
-
value
属于const float&
型 -
T
const float
.
如果是这样,那么在移动声明中将返回的类型声明为: std::remove_reference<T>::type&&
,因为 T 已经不是引用了。
此外,如果std::move
将引用(实践中的 l 值引用)作为参数,那么实际上由于引用折叠而返回static_cast<T&&>(t)
std::move
将返回 l 值引用或 r 值引用,因此它的行为更像std::forward
不移动。那么,什么是我不明白的技巧,使它正常工作?
您的示例不正确:
int five=5;
someFunction(five);
在这种情况下,T
被推导出为int&
,而不是int
。第二个例子也是如此; T
被推算为const int&
。
因此,只返回T&&
意味着T&& &
,这是由于引用折叠规则而T&
的。
这就是需要std::remove_reference
的原因,以确保类型上没有引用,以防止发生引用折叠。
相关文章:
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 使用容器中元素的别名删除带有 std::list::remove 的元素是否正确?
- C++代码"x.erase(std::remove(x.begin(), x.end(), ), x.end())"是如何工作的?
- std::remove, std::move(range) and moved-from elements
- 在不同类型的向量上使用 std::remove 的不同结果
- 为什么 std::remove 不删除数组的最后一个元素
- std::remove 和 std::remove_if 设计的稳定性是否失败
- std::unordered_map:渐近{search,insert,remove}性能取决于密钥的大小和数据类型
- std::remove 不起作用
- 为什么std::whatever::erase()是一个方法,std::remove()是独立函数
- std::erase 和 std::remove 组合以删除特定元素不适用于特定示例
- std::remove函数中的转换错误
- 使用 std::erase 和 std::remove 从矢量中删除元素,不使用自定义结构作为值
- vector.erase 和 std::remove 在自定义向量上
- 需要了解 std::remove with vector.erase
- 为什么std::remove不能和std::set一起工作
- 如何为std::list重载std::remove
- std::remove导致编译错误
- Std::remove不是从Std::vector中移除
- 为什么std::remove取迭代器的const版本