c 11 最反直覺的地方

2021-12-29 21:46:49 字數 1929 閱讀 1708

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 這個關鍵字的存在,但是可以通過多型來實現,多型...