https://en.cppreference.com/w/cpp/language/decltype

    如果参数是一个没有括号包围的id-expression或者没有括号包围的class member access expression,decltype给出的是这个id或者这个member的声明类型。

    否则,如果参数是一个类型为T的表达式,那么:

    1. 当参数值类型是xvalue时,decltype是 T&&
    2. 当参数值类型是lvalue时,decltype是T&
    3. 当参数值类型是prvalue时,decltype是T