1. 程式人生 > >c++11 decltype

c++11 decltype

命名 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