c decltype關鍵字的用法

2022-09-25 06:48:13 字數 2383 閱讀 9217

1. decltype關鍵字的用途是什麼

給定變數的名稱或者表示式,decltype返回變數或者表示式的型別。如下所示:

const int i = 0; // decltype(i) is const int

bool f(const widget& w); // decltype(w) is const widget&,decltype(f) is bool(const widget&)

struct point ;

widget w; // decltype(w) is widget

if (f(w)) ... // decltype(f(w)) is bool

template vector ;

vector v; // decltype(v) is vector

if (v[0] == 0) ... // decltype(v[0]) is int&

2.decltype主要應用場景是模板函式

decltype在實際的開發中主要用於模板函式中,函式的返回值依賴於模板引數型別的情況。如下authandaccess函式的返回值型別依賴於container的元素型別。

template

auto authandaccess(container& c, index i) -> decltype(c[i])

此處的返回值auto並非型別推導的意思,而是c++ 11中的函式返回型別後置的表達方式,表明函式的返回型別在引數列表之後。函式返回型別後置的優勢在於我們可以用函式的引數來指定返回值。

在c++ 14中auto關鍵字可以獨立用於對函式的返回值進行型別推導,而不必採用c++ 11中的返回返回型別後置的宣告方式:

template

auto authandaccess(container& c, index i)

但上述寫法在實際應用針對具體case可能存在問題,比如如果operator返回t&,auto的推導機制會返回t,下面的就會編譯失敗:

std::deque d;

...authandaccess(d, 5) = 10; //return d[5], then assign 10 to it; this won't compile!

因為根據auto的推導機制,authandaccess返回的是右值,所以編譯不通過。authandaccess函式需要宣告為如下方式才可以保證該示例編譯通過。

template程式設計客棧;

decltype(auto) authandaccess(container& c, index i)

decltype(auto)不僅僅可以用於函式,也可以用於變數,可以完美推導變數的型別。

widget w;

const widget& cw = w;

auto mywidget1 = cw; // auto type deduction: mywidget1's type is widget

decltype(auto) mywidget2 = cw; // decltype type deduction: mywidget2's type is const widget&

再回到authandaccess函式

template

decltype(auto) authandaccess(container& c, index i);

注意到container是乙個非const的左值引用,這意味著使用者可以修改container內元素的值,同時也意味不能傳遞右值引用給它。

另外右值容器一般是乙個臨時物件,會在函式呼叫結束後不久被銷毀,所以當使用者傳入乙個右值引用的時候,一般我們要把返回元素拷貝它的乙個副本。如何能夠在不過載authandaccess函式的情況下使它同時支援左值和右值呢?答案是通用引用。

template

decltype(auto) authandaccess(container&& c,index i);

為了保證推導結果的正確性,需要在實現中增加完美**(std::forward)功能。

template

decltype(auto)authandaccess(container&& c, index i) // c++ 14版本

template

auwww.cppcns.comto authandaccess(container&& c, index i)

-> decltype(std::forward(c)[i])

// c++ 11版本

3. decltype使用的極端case

decltype(auto) f1()

decltype(auto) f2()

返回了乙個區域性變數的引用。

4. 需要記住的:

1) decltype總是返回與變數或者表示式完全相同的型別;

2) 對於型別t的非名稱的左值表示式,decltype總是返回t&;

關鍵字的用法 C 中const關鍵字用法總結

ark2000 看完了c primer的基礎篇,對const還是有點陌生,在這裡小小地總結一下吧。在變數的定義前加上const修飾符即可完成const物件的建立。const int val 5 const變數的值不能改變。val 5 error assignment of read only var...

const關鍵字用法

1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...

restrict關鍵字用法

概括的說,關鍵字restrict只用於限定指標 該關鍵字用於告知編譯器,所有修改該指標所指向內容的操作全部都是基於 base on 該指標的,即不存在其它進行修改操作的途徑 這樣的後果是幫助編譯器進行更好的 優化,生成更有效率的彙編 舉個簡單的例子 int foo int x,int y 很顯然函式...