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 ()); 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; 直接宣告變數,必須同時初始化。 劉雲賓 編譯器認為,8 的型別是 int 因為非類非陣列的純右值沒有 CV 屬性 所以,它會推導為 int ay 8 這顯然是錯誤的。非類非陣列的純右值不能有cv 限定。注意 函式呼叫或轉型表示式可能生成非類的 cv 限定型別的純右值,但其 cv 限定符被立即剝除。值類別 cppreference.... 徐辰 因為C 他爹早就看0這個magic number不爽了,當年沒顧上搞,一直拖到2011年了,再不瘋狂一把C 就沒人用了。 enpeng xu 問題的關鍵是c 不知道怎麼正確做void 到 T 的預設轉換,所以多此一舉的引入了nullptr。某些情況做下c 編譯器不知道怎麼把 void ptr正... 如果沒有優化,傳值可能更快一些,值能進register。而引用,相當於指標。數學函式,比如abs,exp這些,都是傳值的。 或許是考慮到可能用原來vector的某個元素來resize,比如vector.resize 1,vector 99 這種情況下引用可能失效,需要在操作前先拷貝一次。反正都要拷貝...c 11中 auto 定義的引用為什麼不能繫結字面值?
C 11為什麼引入nullptr?
為什麼 C 11 之前,std vector resize 要傳遞值,而不是常引用?