zoukankan      html  css  js  c++  java
  • 深入理解C++11附录B_2021.11.22

    深入理解C++11
    附录B
    弃用的特征

    1.auto:
    可在任何需要声明变量类型的上文中使用,但不能声明函数参数(因为重载的原因,不能这么使用),也不能推导数组类型

    类型判断
    类型判断的引入主要是为了获取变量的类型,使用decltype()可以在编译期间获取变量的类型:

    2.export

    特征被移除,关键字被保留,但不包含任何语义。

    3.register

    仅用于一个区块内的变量声明或作为函数参数的声明。

    4.隐式拷贝函数:不会自动生成

    若用户已经声明一个拷贝复制操作符或一个析构函数,那么编译器不会隐式声明一个拷贝构造函数。

    5.auto_ptr

    auto_ptrunique_ptr所取代,当系统异常退出时避免资源泄漏。

    unique_ptr对象中有一个指向另一个对象的指针,并且在它自身析构时析构该对象。

    unique_ptr要进行对象转移,需要使用std::move函数,将对象转化为右值。因为

    unique_ptr的拷贝构造函数已被deleted。所以,转化为右值之后,利用构造函数,将a中的指针进行转移。如:

    std::unique_ptr a(new int);

    std::unique_ptr b = std::move(a);

    std::unique_ptr d(std::move(a));

    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。

    8.动态异常声明

    有参数的异常声明被弃用,空异常声明throw()被noexcept取代。

    在实践中,只有两种异常的抛出确实是有用的:程序会抛出异常或不会抛出异常。前者可以由完全省略异常声明来表示;后者则可以由throw()来表示。但由于性能方面的考虑,还是很少被用到。11中提出用noexcept关键字表示函数不会抛出异常,或者说异常不会被截获并处理。

    当noexcept关键字的意义其实就等于noexcept(true)。当用noexcept修饰的函数,也就是不允许抛出异常的函数中抛出异常时,编译器会调用std::terminate().

    与throw()不同,noexcept(true),不需要编译器生成额外的代码来进行运行时检查,使用更灵活,因此完全可以取代throw()

    综上:由于含有参数的动态异常声明在实际声明中没有使用价值,而空动态异常声明throw()已被noexcept取代,所以动态异常声明,也就是throw(type-id-listopt)被弃用

  • 相关阅读:
    leetcode_09_Palindrome Number (easy)
    JQuery与JavaScript与Ajax三者的区别与联系
    Blockly常用函数
    JavaWeb中四大域对象
    Thymeleaf知识
    列表、字典、元组、集合的区别
    Spring Boot拦截器
    AWS路由表
    Android调试工具DDMS的使用详解
    Android 列表单选对话框
  • 原文地址:https://www.cnblogs.com/gwzz/p/15589973.html
Copyright © 2011-2022 走看看