跳到主要内容

C++11 auto、decltype

简化声明

C++11 提供了多种简化声明的功能,尤其在使用模板时

auto

C++98 中,关键字 auto 是一个存储类型说明符,C++11 将其用于实现自动类型推断

在初始化声明中,如果使用关键字 auto,而不指定变量类型,编译器将把变量的类型设置成与初始值相同

eg.
auto n = 100; // int
auto x = 1.5; // double
auto y = 1.3e12L // long double
  • auto 变量必须在定义时初始化

但是 auto 并不是为了这种简单的情况设计的,处理复杂类型时,才能体现 auto 的优势

例如标准库模块(STL)中的类型

eg.
// C++98
std::vector<double> scores;
std::vector<double>::iterator pv = scores.begin();
// C++11 允许以如下方式重写
std::vector<double> scores;
auto pv = scores.begin();

auto 用于定义模板函数

例如定义一个求乘积的函数模板

eg.
template <typename T1,typename T2>
void Multiply(T1 x, T2 y) {
auto result = x * y;
std::cout << result;
}
  • 如果没有 auto result 的类型定义将会变得很繁琐

auto:引用、指针和const

  • C++11 中,对于引用,auto 默认使用传值的方式,但是,也可以使用 & 修饰符强制使用引用
int& func();
auto a = func(); // int
auto& b = func(); // int&
  • 如果有一个指针auto,它会自动成为一个指针类型,也可以显式指明该变量是一个指针
int* func();
auto p_a = func(); // int*
auto *p_b = func(); // int*
  • 如果需要,可以在处理引用时,为auto添加const修饰符
int& func();
const auto& a = func(); // const int&
  • const修饰符结合指针
int* func();
const int* const_func();
const auto* a = func(); // const int*
auto b = const_func(); // const int*

decltype和新的返回值语法

新的返回值语法:后置返回类型

  • C++11 中,你可以将返回值放在函数声明的最后,将auto放在返回值的位置
auto func(int x, int y) -> int;

decltype

decltype

  • auto允许用特殊的类型声明变量,decltype则允许从一个变量(或任何表达式)导出类型

关键字 decltype 将变量的类型声明为表达式指定的类型 decltype(x) y;

eg.
int n;
double x;
decltype(x * n) y; // double
decltype(&x) z; // double *

根据使用的表达式,指定的类型可以为引用和 const

eg.
int i = 3;
int &k = i;
const int &n = i;
decltype(n) j1; // const int &
decltype(i) j2; // int
decltype((i)) j3; // int &
decltype(k + 1) j4; // int

在定义模板时 decltype 将会很有用,因为模板要在实例化时才能确定类型

template<typename T1, typename T2>
void func(T t1, U t2){
decltype(t1 * t2) t;
// code
}

模板函数依赖于模板参数的返回值

template <typename T1,typename T2>
auto Multiply(T1 x, T2 y) -> decltype(T1 * T2) {
return x * y;
}