0%
decltype
introduction
- C++11 引入的 decltype
- 傳入一個型別、值或運算式(expression)給 decltype 即可獲得該傳入的東西其型別為何
- decltype 最管用的地方大概是 function templates,利用給定的函數參數推導出回傳型別
- e.g.
1
| decltype(1.0 + 1) the_double = 0.0;
|
1 2 3 4 5 6 7 8
| void main() { int a = 10; decltype(a) b;
b = 123;
std::cout << b << std::endl; }
|
- 透過decltype來定義一個和a一樣的type,因為a的type為int所以b的type也是int
- C++14 進一步定義了 decltype(auto),可用於函數的回傳型別定義,如此一來,便可確定函數定義與實際回傳型別吻合:
1 2 3 4 5 6 7 8 9 10 11 12
| template <typename Container, typename Index> auto authAndAccess(Container &c, Index i) -> decltype(c[i]) { return c[i]; }
template <typename Container, typename Index> decltype(auto) DoSomething(Container& c, Index i) { return c[i]; }
|
advanced
decltype(entity)
: 如果entity是一個不被括號包圍的識別符號、類訪問表示式,那麼decltype(entity)
與entity型別一致。
decltype(expression)
: 如果expression是一個表示式,計算結果為型別T,那麼:
- 如果expression為xvalue,那麼decltype的結果是T&&.
- 如果expression為lvalue,那麼decltype的結果是T&.
- 如果expression為prvalue,那麼decltype的結果是T.
reference