概述
类型推导主要是依赖auto
关键字和decltype
关键字/运算符实现的,具体用法参考下面的例子。
二者特点:
auto
用于声明时推导遍历decltype
用于推导各种表达式, decltype(var)中var也是一种称为变量表达式的表达式- 二者都是在编译时进行推导。
- 引用类型推断:
decltype
推断变量类型时会保留引用性质,而auto
会忽略引用性质,将其推断非引用类型
使用场合:
decltype
适用于需要根据表达式类型声明变量的场合,特别是在模板元编程和泛型编程中,可以用于推断函数返回类型、模板参数类型等。auto
适用于需要根据初始化值推断变量类型的场合,可以简化代码,减少类型冗余,提高代码的可读性和可维护性。它特别适用于迭代器、范围循环、lambda表达式等情况下。
用法举例
参考测试项目的modrenc_auto_decltype.cpp
文件
主要内容:
- auto 推导变量和返回值时的使用场景
- decltype 推导各种表达式的使用场景
- decltype 用于完美转发
#include "ModernCppTestHeader.h"
namespace n_auto {
template <class T, class U>
auto add(T t, U u) { return t + u; }
// C++ 支持值模板
template <auto n>
auto f() -> std::pair<decltype(n), decltype(n)>
{
return { n, n };
}
// 完美转发 decltype(auto)
template <class F, class... Args>
decltype(auto) pref_forward(F f, Args&&... args)
{
return f(std::forward<Args>(args)...);
}
}
void auto_decltype_test()
{
LOG_FUNC();
LOG_TAG("auto&decltype 推导变量");
auto a0 = 1 + 2;
auto a1 = a0;
decltype(auto) a2 = a0;
decltype(auto) a3 = (a0);
auto a4 = { 1, 2 };
auto a5 {10}; //使用{}构造器
auto [a6, a7] = n_auto::f<0>(); //结构化绑定
auto a8 = n_auto::add(1, 1.2);
LOG_VAR_TYPE(a0);
LOG_VAR_TYPE(a1);
LOG_VAR_TYPE(a2);
LOG_VAR_TYPE(a3);
LOG_VAR_TYPE(a4);
LOG_VAR_TYPE(a5);
LOG_VAR(a6);
LOG_VAR_TYPE(a6);
LOG_VAR(a7);
LOG_VAR_TYPE(a7);
LOG_VAR_TYPE(a8);
LOG_TAG("auto 用于指代lambda");
auto b0 = [](int x) {LOG_VAR(x); };
b0(10);
LOG_TAG("decltype(auto) 用于完美转发");
auto c0 = [](int x1, int x2) {return x1 + x2; };
auto c1 = n_auto::pref_forward(c0, 1, 5);
LOG_VAR(c1);
}
标签:decltype,LOG,推导,auto,Modern,C++,VAR,TYPE
From: https://www.cnblogs.com/hggzhang/p/17523866.html