https://en.cppreference.com/w/cpp/language/decltype
如果参数是一个没有括号包围的id-expression或者没有括号包围的class member access expression,decltype给出的是这个id或者这个member的声明类型。
否则,如果参数是一个类型为T的表达式,那么:
- 当参数值类型是xvalue时,decltype是 T&&
- 当参数值类型是lvalue时,decltype是T&
- 当参数值类型是prvalue时,decltype是T