使用auto
自动类型推断,顾名思义,就是编译器能够根据表达式的类型,自动决定变量的类型(从 C++14 开始,还有函数的返回类型),不再需要程序员手工声明。
但需要说明的是,auto 并没有改变 C++ 是静态类型语言这一事实——使用 auto 的变量(或函数返回 值)的类型仍然是编译时就确定了,只不过编译器能自动帮你填充而已。
自动类型推断不仅降低了代码的啰嗦程度,也提高了代码的抽象性,使我 们可以用更少的代码写出通用的功能。
auto 实际使用的规则类似于函数模板参数的推导规则。
当写了一个含 auto 的表 达式时,相当于把 auto 替换为模板参数的结果。举具体的例子:
auto a = expr; 意味着用 expr 去匹配一个假想的 template f(T) 函数模板,结果为值类型。
const auto& a = expr; 意味着用 expr 去匹配一个假想的 template f(const T&) 函数模板,结果为常左值引用类型。
auto&& a = expr; 意味着用 expr 去匹配一个假想的 template f(T&&) 函数模板,根据 [第 3 讲] 中我们讨论过的转发引用和引用坍缩规则,结果是 一个跟 expr 值类别相同的引用类型。
decltype
decltype 的用途是获得一个表达式的类型,结果可以跟类型一样使用。它有两基本用 法:
1. decltype(变量名) 可以获得变量的精确类型。
2. decltype(表达式) (表达式不是变量名,但包括 decltype((变量名)) 的情况)可以获得表达式的引用类型;
除非表达式的结果是个纯右值(prvalue),此时结果仍然是值类型。
例子:
如果我们有 int a;,那么:
decltype(a) 会获得 int(因为 a 是 int)。
decltype((a)) 会获得 int&(因为 a 是 lvalue,情况二表达式情况)。
decltype(a + a) 会获得 int(因为 a + a 是 prvalue)。
decltype(auto)
通常情况下,能写 auto 来声明变量肯定是件比较轻松的事。但这儿有个限制,需要在写 下 auto 时就决定你写下的是个引用类型还是值类型。
根据类型推导规则,auto 是值类 型,auto& 是左值引用类型,auto&& 是转发引用(可以是左值引用,也可以是右值引 用)。
使用 auto 不能通用地根据表达式类型来决定返回值的类型。
不过, decltype(expr) 既可以是值类型,也可以是引用类型。因此,我们可以这么写:
decltype(expr) a = expr;
这种写法明显不能让人满意,特别是表达式很长的情况(而且,任何代码重复都是潜在的问 题)。为此,C++14 引入了 decltype(auto) 语法。对于上面的情况,我们只需要像下 面这样写就行了。
decltype(auto) a = expr;
这种代码主要用在通用的转发函数模板中:可能根本不知道你调用的函数是不是会返回一 个引用。这时使用这种语法就会方便很多。
标签:decltype,auto,易用性,C++,改进,引用,expr,类型,表达式 From: https://www.cnblogs.com/JohnsonQ/p/17022648.html