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