5.declytpye
类型说明符,用以提取变量、表达式和左右值的类型,语法格式:
decltype(exp) var;
通过以下使用示例表现decltype特性:
int num = 111;
int& refNum = num;
decltype((num)) roundRefNum = num; // 表达式或变量自带圆括号,提取类型为 int&
decltype(num) _num = 222; // 纯左值,提取类型为 int
decltype(refNum) declRefNum = num; // 左值引用,提取类型为 int&
decltype(333) rvNum = 444; // 纯右值,提取类型为 int
decltype(555)& addRefNum = num; // 提取类型为 int,添加引用符 & 后类型变为 int&
decltype(move(num)) rvRefNum = move(666); // 右值引用,提取类型为 int&&
// 对于 decltype(555)& addRefNum = num; 如果赋值为左值引用,那最终类型是左值引用
decltype(777)& _addRefNum = refNum; // 提取类型为 int,添加引用符 & 后类型变为 int&
有了auto,为何还要用decltype:
-
auto主要还是用于类型推导,需要根据等号右侧的表达式的计算结果来进行推导,并且赋值,而decltype用于类型的提取,但有些时候,并不希望计算表达式,也不希望赋值:
c++ auto aNum = 1 + 5.8; // 计算表达式结果为 6.8,推导类型为 double,并赋值给 aNum decltype(1 + 5.8) dNum; // 提取表达式 1 + 5.8 的类型,dNum 类型设置为 double,且并未初始化- 模板参数不能使用auto,但可以使用decltype```c++ int num = 666; vector
autoArr; // 编译报错,语法不允许 // 使用 decltype 提取表达式类型,arr 类型为 vector
vector declArr; ``` - 返回值依赖于参数类型的函数模板,在C++14标准的尾置返回类型中,用以通过模板函数调用时,提取参数类型作为返回类型,或者可以理解为因为返回类型和参数类型有关,所以使用decltype提取核心算子确认返回类型: ```c++ template
auto Addition(Ta a, Tb b) -> decltype(a + b) { // 返回类型由核心算子 a + b 提取为 double return (a + b); } // 模板函数调用 auto num = Addition(111, 555.666); ```
补充,关键字decltype(auto),占位符类型说明符:用以函数模板不确定返回值类型时使用,可以使用该关键字:
template<typename FunType, typename... Args>
decltype(auto) Example(FunType func, Args&&... args)
{
/**
* 返回类型不确定,可能是引用,也可能是值,直接用 decltype(auto) 推导提取返回类型
* forward 用于确保 func 调用时,传入的 args 仍然是右值引用
*/
return func(forward<Args>(args)...);
}
- 邮箱 :charon.chui@gmail.com
- Good Luck!