c 11 既然有auto了,為什麼又要有decltype呢?

時間 2021-05-30 16:22:35

1樓:小板凳

decltype 可以讓你獲得編譯期的型別。 auto不能。這一點讓 decltype 有很多玩法。

光是這樣說不好理解,具體舉乙個檢測編譯期乙個類是否包含乙個 foo()方法為例子,(decltype 配合模板使用可以檢測幾乎任意方法是否實現)

//c++14

#include

// for srd::experimental::is_de_detected

#include

#include

template

T>using

has_foo_func

=decltype

(std

::declval

().foo

());

struct

HasFoo

};struct

NotHasFoo

;int

main

()std::experimental::is_detected 實現挺簡單的,有興趣就網上搜尋下看看。

2樓:

decltype 與 auto 的使用場景與型別推導規則都不一樣。

Scott Meyers 的新書 《Effective Modern C++》中第一章就是介紹的型別推導。

[譯] Item 1: Understand template type deduction

[譯] Item 2: Understand auto type deduction

[譯] Item 3: Understand decltype

3樓:Sunchy321

含義不同。

auto主要在不知道,或者不可能知道型別的情況下使用,而decltype用於獲取某個表示式的型別。

另外它們的含義也有區別,auto總是去除引用和頂層修飾符,因此C++1y提出來decltype(auto)的用法。

4樓:pretty kernel

一句話概括,當你需要某個表示式的返回值型別而又不想實際執行它時用decltype。

例如:int a=8, b=3;

auto c=a+b; //執行時需要實際執行a+b,哪怕編譯時就能推導出型別

decltype(a+b) d; //編譯期型別推導不可以用auto c; 直接宣告變數,必須同時初始化。

c 11中 auto 定義的引用為什麼不能繫結字面值?

劉雲賓 編譯器認為,8 的型別是 int 因為非類非陣列的純右值沒有 CV 屬性 所以,它會推導為 int ay 8 這顯然是錯誤的。非類非陣列的純右值不能有cv 限定。注意 函式呼叫或轉型表示式可能生成非類的 cv 限定型別的純右值,但其 cv 限定符被立即剝除。值類別 cppreference....

C 11為什麼引入nullptr?

徐辰 因為C 他爹早就看0這個magic number不爽了,當年沒顧上搞,一直拖到2011年了,再不瘋狂一把C 就沒人用了。 enpeng xu 問題的關鍵是c 不知道怎麼正確做void 到 T 的預設轉換,所以多此一舉的引入了nullptr。某些情況做下c 編譯器不知道怎麼把 void ptr正...

為什麼 C 11 之前,std vector resize 要傳遞值,而不是常引用?

如果沒有優化,傳值可能更快一些,值能進register。而引用,相當於指標。數學函式,比如abs,exp這些,都是傳值的。 或許是考慮到可能用原來vector的某個元素來resize,比如vector.resize 1,vector 99 這種情況下引用可能失效,需要在操作前先拷貝一次。反正都要拷貝...