1 auto 會自動把 引用 去除掉
int& get();
auto k = get(); // k的型別是int,而不是int&
derived object;
auto& same_object = (base&)object;
auto another_object = (base&)object; //會重新構造個base物件
2 decltype 有時會自動把 引用 加上
int x;
decltype((x)) 和 decltype(*&x) 的型別是int&,而不是int
在巨集中使用decltype時,要特別注意別多加了括號。
下面這段**錯在**?
template
auto min(t t, r r) -> decltype(t < r ? t : r)
decltype(t < r ? t : r)的型別是t&或r&,而不是所希望的t或r!
標準是這樣規定的:
the type denoted by decltype(e) is defined as follows:
— if e is an unparenthesized id-expression or an unparenthesized class member
access (5.2.5), decltype(e) is the type of the entity named by e. if there
is no such entity, or if e names a set of overloaded functions, the program
is ill-formed;
— otherwise, if e is an xvalue, decltype(e) is t&&, where t is the type of e;
— otherwise, if e is an lvalue, decltype(e) is t&, where t is the type of e;
— otherwise, decltype(e) is the type of e.
3 std::move、std::forward、右值引用
c++11 引入 右值引用,可以做到:函式**、針對臨時物件優化
move是動詞,從字面上理解好像是要移動物件,其實std::move只是簡單的將型別轉成右值引用而已!!! 可以理解成 cast_to_rvalue_reference 或 treat_as_temporal_object。
void test1(int&&) {}
void test2(int&& value) //注意:value的型別是int,而不是int&&
test2函式中,value的型別是int,而不是int&&。
這是乙個不得已的選擇。如果value的型別是int&&的話,就會有***:
void increase(int& value)
void test3(int&& value)
char ch = 'a';
test3(ch); //本意是改變ch值,但實際上ch值不會改變,改變的是臨時對像
通過**函式test3,increase函式可以修改臨時對像,
這造成程式設計師犯的錯誤(如上面的例子),難以在編譯時就被找出來。
std::forward(value) 等價於 static_cast(value),感覺後者更容易理解。
std::forward 起到的**作用。如果t型別為 r&、 r&&,經過型別轉換後,其型別還是和原來的一樣。
在c++11中 www.2cto.com
r& & 等同於 r& (在c++03中,r& &這種寫法是非法的)
r&& & 等同於 r&
r& && 等同於 r&
r&& && 等同於 r&&
C 11的新特徵
c 11對從前的語言做了很大的擴充套件,在我的感覺來看,加入了很多類似於python的語法,在以前嚴謹完整的基礎上增加了便捷性,更加人性化了,這裡摘取一部分書上提到的新特徵,做乙個讀書筆記。1.使用auto自動宣告變數或者物件 比如說 auto i 42 i has type int double ...
C 11 模板的改進
在c 98 03的泛型程式設計中,模板例項化有乙個很繁瑣的地方,就是連續兩個右尖括號 會被編譯解釋成右移操作符,而不是模板參數列的形式,需要乙個空格進行分割,以避免發生編譯時的錯誤。template class x template class y int main 在例項化模板時會出現連續兩個右尖...
C 11 類的多型
c 中類的三大特性是 繼承,封裝,多型。因為近期寫 用到了類的多型性,所以在這裡再總結一下。關於多型的定義,我是參考大佬的文章再加上自己的理解得到以下內容的,大佬鏈結在此。多型性可以簡單地概括為 乙個介面,多種方法 雖然在c 中沒有介面 inte ce 這個關鍵字的存在,但是可以通過多型來實現,多型...