1. decltype
decltype
的使用方式如下:
decltype(expression) var;
關(guān)鍵字decltype
的作用是將變量的類型聲明為表達式指定的類型。即將var
的類型聲明為expression
指定的類型。編譯器在處理decltype
的時候,實際上需要對expression
進行一個核對,然后才能確定var
的類型。其流程和核對規(guī)則大致如下:
- 1) : 如果
expression
是一個沒有用括號括起來的標識符,則var
的類型與該標識符的類型相同 。例如:
double x = 1.0;
double y = 2.0;
double &lx = x;
const double *pd;
decltype(x) m; //m的類型為double
decltype(lx) n = y; //n的類型為double &
decltype(pd) u; //u的類型為const double *
- 2) :如果
expression
的條件不符合1), 而expression
是一個函數(shù)的調(diào)用,則var
的類型與函數(shù)的返回值類型相同。 例如:
int sum(int a, int b){...}
decltype(sum(1,2)) m; //m的類型為int
- 3) :如果
expression
的條件不滿足1)、2), 而expression
是一個左值,則var
指向該左值類型的引用。 例如:
double xx = 1.0;
decltype( (xx) ) rx = xx; //rx的類型是double &
decltype(xx) m = xx; //m的類型是double,因為雖然xx是左值,但該類型的確定在步驟1)就已經(jīng)確認了,所以走不到步驟3)
【 注 :括號并不能改變表達式的值和左值性。】
- 4) : 如果
expression
的條件不滿足1)、2)、3),則expression
的類型就是var的類型。 例如:
int a = 1;
int &b = a;
int &c = a;
decltype(a+1) a1; //a1的類型為int
decltype(100L) aa;//aa的類型為long
decltype(b+c) bc; //bc的類型為int,雖然b和c都是引用,但b+c不是引用,而是兩個int的和,因此bc的類型也為int
2. 返回類型后置
C++11新增加了一種函數(shù)聲明的語法:在函數(shù)名和參數(shù)后面指定返回類型。該語法與auto
搭配使用,其使用形式如下所示:
auto fun(int a, int b) - > int
該語法主要是為了解決某些模板函數(shù)返回值類型問題,例如下面這個模板函數(shù):
template< typename T, typename U >
??? fun(T t, U u)
{
...
return t + u;
}
該模板函數(shù)的返回值如何確定呢?首先很容易想到的是將decltype(t+u)
設(shè)置為該模板函數(shù)的返回值,但是不行的是,此時還未聲明x
和y
,編譯器還識別不到他們,更無法使用他們,因此,C++11新增了返回值類型后置的這種語法,針對上述的模板函數(shù),使用新增的語法可以寫為:
template< typename T, typename U >
auto fun(T t, U u) - > decltype(t + u) //此時decltype在參數(shù)t和u聲明的后面,可以正常使用他們
{
...
return t+u;
}
-
C++語言
+關(guān)注
關(guān)注
0文章
147瀏覽量
6952 -
gcc編譯器
+關(guān)注
關(guān)注
0文章
78瀏覽量
3347
發(fā)布評論請先 登錄
相關(guān)推薦
評論