c/c++-decltype

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
    // in c++11
    template <typename Container, typename Index> // works, but requires refinement
    auto authAndAccess(Container &c, Index i) -> decltype(c[i]) {
    return c[i];
    }
    // in c++14
    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