標籤:cto warning war ble col ring out return log
c++11 decltype
decltype實際上有點像auto的反函數,auto可以讓你聲明一個變數,而decltype則可以從一個變數或運算式中得到類型。decltype在C++11標準制定時引入,主要是為泛型程式設計而設計,以解決泛型程式設計中,由於有些類型由模板參數決定,而難以(甚至不可能)表示之的問題。decltype無法在衍生類別聲明和解構函式調用中使用。
類似於sizeof操作符,decltype也不需對其運算元求值。粗略來說,decltype(e)傳回型別前,進行了如下推導: ?
若運算式e指向一個局部變數、命名空間範圍變數、靜態成員變數或函數參數,那麼 傳回型別即為該變數(或參數)的“宣告類型”; ?
若e是一個左值(lvalue,即“可定址值”),則decltype(e)將返回T&,其中T為e的類型;
若e是一個x值(xvalue),則傳回值為T&&; ?
若e是一個純右值(prvalue),則傳回值為T。
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <vector>#include <map>void mytest(){ int i; decltype(i)j = 0; std::cout << typeid(j).name() << std::endl; // j ---> int float a; double b; decltype(a+b) c; std::cout << typeid(c).name() << std::endl; // c ---> double std::vector<int> vec; typedef decltype(vec.begin()) vectype; vectype k; std::cout << typeid(k).name() << std::endl; for (k = vec.begin(); k < vec.end(); k++) { // do some thing ... } enum // 匿名枚舉變數 { OK, Error, Warning } flag; decltype(flag) tmp = OK; std::cout << typeid(tmp).name() << std::endl; return;}int main(){ mytest(); system("pause"); return 0;}
c++11 decltype