郑州区块链数字钱包网站开发方案,网站开发公司哪里寻找客源,网站建设哪个比较好,网站引入百度地图目录
1--右值引用
2--std::move
3--移动构造函数
4--移动赋值运算符
5--移动迭代器
6--引用限定符 1--右值引用 右值引用必须绑定到右值的引用#xff0c;通过 获得右值引用#xff1b; 右值引用只能绑定到临时对象#xff08;即将被销毁的对象#xff09…目录
1--右值引用
2--std::move
3--移动构造函数
4--移动赋值运算符
5--移动迭代器
6--引用限定符 1--右值引用 右值引用必须绑定到右值的引用通过 获得右值引用 右值引用只能绑定到临时对象即将被销毁的对象即所引用的对象将要被销毁对象没有其他用户 返回非引用类型的函数连同算术、关系、位已经后置递增/递减运算符都生成右值 int i 42;
int r1 i; // 左值引用i是一个变量是左值
int r2 i * 42; // 右值引用i*42是一个临时对象是右值
2--std::move std::move 用于获得绑定到左值上的右值引用其定义在头文件 utility 中 int r1 42; // 右值引用但r1是一个左值
int r2 std::move(r1); // 调用std::move调用后只能对r1进行赋值或销毁不能再使用
3--移动构造函数 移动构造函数的第一个参数是该类类型的一个右值引用 移动构造函数必须确保移动后销毁源对象是无害的 移动构造函数不分配任何新内存只是接管给定的内存 A::A(A s) noexcept : data1(s.data1), data2(s.data2), data3(s.data3){s.data1 s.data2 s.data3 nullptr;
}
// 假定data1data2 和 data3 均是指针
// noexcept 的作用是通过标准库对于上述构造函数不抛出任何异常
// 在移动构造函数的函数体中对源对象的指针数据进行赋值可以避免由于源对象析构导致释放刚刚移动的内存的问题
4--移动赋值运算符
A A::operator(A sample) noexcept{if(this ! sample){data1 sample.data1;data2 sample.data2;data3 sample.data3;sample.data1 sample.data2 sample.data3 nullptr;}return *this;
}
5--移动迭代器 移动迭代器的解引用运算符生成一个右值引用通过调用标准库的 make_move_iterator 函数可以将一个普通迭代器转换为一个移动迭代器 移动一个对象可能会销毁原对象当确信一个算法为一个元素赋值或传递给函数后不会再访问原对象才能使用移动迭代器将对象传递给算法 #include iostream
#include iterator
#include string
#include vectorint main (int argc, char *argv[]){std::vectorstd::string foo (3);std::vectorstd::string bar {A, B, C};typedef std::vectorstd::string::iterator Iter;std::copy ( std::move_iteratorIter(bar.begin()), // 使用移动迭代器std::move_iteratorIter(bar.end()),foo.begin() );bar.clear(); // 移动 bar 后清理std::cout foo:;for (std::string x : foo) std::cout x;std::cout std::endl;;return 0;
}
6--引用限定符 右值没有内存实体一般不能对其进行调用成员函数或赋值但有时会出现以下情况即右值调用成员函数或对右值进行赋值 string s1 abc, s2 def;
auto n (s1 s2).find(a); //(s1 s2)是一个右值对右值调用成员函数
s1 s2 wc; //(s1s2)是一个右值对右值赋值上述代码其实是没意义的但 C11 仍然保留了这种右值赋值或调用成员函数的机制通过使用引用限定符可以显式阻止函数被左值或右值调用 class demo{int get_num(); // 默认情况下成员函数既可以被左值或右值对象调用int get_num() ; // 显式限制成员函数必须被左值成员对象调用int get_num() ; //显式限制成员函数必须被右值成员对象调用
}class A{A operator(const A);A operator(const A) ;A operator(const A) ;
}