c++11 decltype
阿新 • • 發佈:2017-11-05
命名 num type for 函數 warning val pre amp
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