C++ | 表示移动函数move()的基本用法
在面向对象编程中,如果想拷贝一个外部传来的二维数组(不希望将其返回),又不想直接开新数组for循环赋值(导致TLE),你会怎么做呢?
move
函数无条件将其自变量强制转换为右值引用,从而表示其可以移动(如果其类型支持移动)。
马++真是贻害无穷啊
头文件
utility
(需要使用命名空间std)。
定义
move
函数源码如下:
_EXPORT_STD template <class _Ty>
_NODISCARD _MSVC_INTRINSIC constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept {
return static_cast<remove_reference_t<_Ty>&&>(_Arg);
}
- 参数类型是模版,参数
Arg
是要强制转换的自变量。 虽然Arg
的类型看起来指定为右值引用,但move
也接受左值参数,原因是左值引用可以绑定到右值引用。 - 返回值:作为右值引用
Arg
,无论其类型是否是引用类型。
通过函数定义可以看出,move
函数没有进行移动操作,而是返回类型转换后的参数。
应用
示例如下,该程序在终端中打印“114”。
#include<iostream>
#include<vector>
#include<utility>
using namespace std;
class solution{
public:
void init(vector<vector<int> > &a){
this->b=move(a);
}
void solve(){
cout<<b[0][0];
}
private:
vector<vector<int> > b;
};
int main()
{
vector<vector<int> > v={{114,514}};
solution s;
s.init(v);
s.solve();
return 0;
}
注意
在move
函数拷贝完成后,原对象会被销毁。即在上述代码的最后加上如cout<<v[0][0];
语句会出现运行时异常。