RaG*_*__M 6 c++ move-semantics c++11
只是为了证实我的理解 std::move
std::move-转换T&到T&&,这样的T's举动构造会踢(如果它已经存在,否则拷贝构造函数会发挥它的作用,除非我们不是外部被删除的举动构造函数/分配).
当我看到std::move它的可能实现时
template<typename T>
typename remove_reference<T>::type&& move(T&& param)
{
using ReturnType =typename remove_reference<T>::type&&;
return static_cast<ReturnType>(param);
}
Run Code Online (Sandbox Code Playgroud)
它使用的原因remove_reference<T>是因为在forward_reference上应用了引用折叠T&&
我只是想知道为什么我们需要前向参考,我们不能这样做
template<typename T>
T&& moveInQuestion(T& p){
return static_cast<T&&>(p);
}
struct someType{};
someType lvalref;
static_assert(is_same<decltype(moveInQuestion(lvalref)),decltype(std::move(lvalref))>::value,"");
Run Code Online (Sandbox Code Playgroud)
static_assert 没有失败.
而且我也相信,意味着的价值类别std::move是lvalue这样的情况moveInQuestion可能会好于std::move?
通常的例子是通用代码
template<class T>
T frob() {
std::vector<T> x = /* ... */;
return std::move(x[0]);
}
Run Code Online (Sandbox Code Playgroud)
有了您move,这打破的时候T是bool,因为在这种情况下x[0]是prvalue代理引用,而不是一个左值.
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |