深入理解C++11-附录B
2021/11/22 20:10:14
本文主要是介绍深入理解C++11-附录B,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
深入理解C++11
附录B
弃用的特征
1.auto:
可在任何需要声明变量类型的上文中使用,但不能声明函数参数(因为重载的原因,不能这么使用),也不能推导数组类型
类型判断
类型判断的引入主要是为了获取变量的类型,使用decltype()可以在编译期间获取变量的类型:
2.export
特征被移除,关键字被保留,但不包含任何语义。
3.register
仅用于一个区块内的变量声明或作为函数参数的声明。
4.隐式拷贝函数:不会自动生成
若用户已经声明一个拷贝复制操作符或一个析构函数,那么编译器不会隐式声明一个拷贝构造函数。
5.auto_ptr
auto_ptr
被unique_ptr
所取代,当系统异常退出时避免资源泄漏。
unique_ptr
对象中有一个指向另一个对象的指针,并且在它自身析构时析构该对象。
unique_ptr
要进行对象转移,需要使用std::move函数,将对象转化为右值。因为
unique_ptr
的拷贝构造函数已被deleted。所以,转化为右值之后,利用构造函数,将a中的指针进行转移。如:
std::unique_ptr
std::unique_ptr
std::unique_ptr
unique_ptr可以存放在标准容器中
当unique_ptr要发生赋值时,只能使用std::move(a),即使用转移构造。
6.bind1st/bind2nd
旧:将二元函数对象绑定成一元仿函数(函数对象)
改动:被bind模板所取代。
新的bind函数模板提供了一种更好的可调用类的参数绑定机制。不需要绑定的参数就用占位符std::placeholds::_J,J从1开始的正整数。
int Func(int x, int y);
function<int(int)> f = bind(Func, 1, placeholders::_1);
f(2); // the same as Func(1, 2);`
转换类型,也就是实现隐式转换的功能,不过可以自定义效果
constexpr operator value_type(){}
void test_bind() { cout << "\ntest_bind" << endl; vector<int> nums = {1, 3, 14, 53, 4, 56, 20}; auto it = find_if(cbegin(nums), cend(nums), bind1st(greater<int>(), 5)); if (it != cend(nums)) cout << *it << endl; auto it1 = find_if(cbegin(nums), cend(nums), bind2nd(greater<int>(), 5)); if (it1 != cend(nums)) cout << *it1 << endl; function<int(int)> f = bind(sub, 100, placeholders::_1); cout << "sub(x, y) -> sub(6): " << f(6) << endl; // function<bool(int)> f_greater = bind(greater<int>(), 5, placeholders::_1); auto f_greater = bind(greater<int>(), 5, placeholders::_1); cout << "greate<int>, 5 > ? result is: " << f_greater(15) << endl; bool is_bind_expr = is_bind_expression<decltype(f_greater)>::value; }
bind所接受的函数对象的参数数量没有限制,用户可随意绑定任意个数的参数而不受限制。因此有了bind,bind1st和bind2nd明显没有了用武之地而被弃用了(deprecated)
7.函数适配器(adaptor)
旧特征:ptr_fun, mem_fun, mem_fun_ref, unary_function, binary_function
新特征:弃用
不需要ptr_fun,直接bind就可以解决了
取代为mem_fn,
这个相当于STL中内置的仿函数,可以使用调取STL容器内对象的内置函数;
mem_fn最为人所熟知的作用是,将一个成员函数作用在一个容器上,就像这样std::for_each(v.begin(), v.end(), boost::mem_fn(&Shape::draw))就可以让容器vector中的每一个元素都执行一遍draw方法。
第二个用法是,它可以帮助把一个函数指针模拟得像一个函数实体(function object)。主要是配合算法使用,如std::for_each。
这篇关于深入理解C++11-附录B的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享