1. 程式人生 > >關鍵字decltype(C++)

關鍵字decltype(C++)

關鍵字decltype

在C++98中,編寫模板函式時,一個問題是非總能知道應在宣告中使用哪種型別。例如:

template<class T1,class T2>
void ft(T1 x, T2 y) {
    ...
    ?type? xpy = x + y;
    ...
}

xpy應為什麼型別呢?由於不知道ft()將如何使用,因此無法預先知道這一點。因此,在C++98中,沒有辦法宣告xpy的型別。 因此,C++11新增的關鍵字decltype提供瞭解決方案。可這樣使用該關鍵字:

int x;
decltype(x) y;  //make y the same type as x

給decltype提供的引數可以是表示式,因此在前面的模板函式ft()中,可使用下面的程式碼:

decltype(x + y) xpy = x + y;

因此,可以這樣修復前面的模板函式ft():

template<class T1, class T2>
void ft(T1 x, T2 y) {
    ...
    decltype(x + y) xpy = x + y;
    ...
}

decltype比這些演示的要複雜些。為確定型別,編譯器必須遍歷一個核對錶。假設有如下宣告:

decltype(expression) var;

則核對表的簡化版如下: 第一步:如果expression是一個沒有用括號括起的識別符號,則var的型別於該識別符號的型別相同,包括const等限定符。 第二步:如果expression是一個函式呼叫,則var的型別與函式的返回型別相同。 第三步:如果expression是一個左值,則var為指向其型別的引用。

宣告:以上整理自個人理解和Stephen Prata 著的《C++ Primer Plus》