關鍵字decltype(C++)
阿新 • • 發佈:2018-12-09
關鍵字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》