1. 程式人生 > 其它 >深入理解C++11-附錄B

深入理解C++11-附錄B

深入理解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。