C++-auto关键词

简介

于C++11引入的auto关键词可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型。

用法

1. 用于代替冗长复杂、变量使用范围专一的变量声明。

1
2
3
4
5
6
7
8
std::vector<std::string> vs;
for (std::vector<std::string>::iterator i = vs.begin(); i != vs.end(); i++) {
//...
}
//可以用auto改写成下面这样
for (auto i = vs.begin(); i != vs.end(); i++) {
//...
}

2. 在定义模板函数时,用于声明依赖模板参数的变量类型

1
2
3
4
5
6
template <typename _Tx,typename _Ty>
void Multiply(_Tx x, _Ty y)
{
auto v = x*y;
std::cout << v;
}

若不使用auto变量来声明v,那这个函数就难定义啦,不到编译的时候,谁知道x*y的真正类型是什么呢?

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

1
2
3
4
5
template <typename _Tx, typename _Ty>
auto multiply(_Tx x, _Ty y)->decltype(_Tx*_Ty)
{
return x*y;
}

当模板函数的返回值依赖于模板的参数时,我们依旧无法在编译代码前确定模板参数的类型,故也无从知道返回值的类型,这时我们可以使用auto。格式如上所示。

decltype操作符用于查询表达式的数据类型,也是C++11标准引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,而难以表示它的问题。

auto在这里的作用也称为返回值占位,它只是为函数返回值占了一个位置,真正的返回值是后面的decltype(_Tx*_Ty)。

C++17后可以不用decltype自动推导

注意事项

  • auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。
  • auto 变量必须在定义时初始化,这类似于const关键字。
  • 定义在一个auto序列的变量必须始终推导成同一类型。例如:
    1
    2
    auto a4 = 10, a5 = 20, a6 = 30;         //正确
    auto b4 = 10, b5 = 20.0, b6 = 'a'; //错误,没有推导为同一类型
  • 函数或者模板参数不能被声明为auto
  • 时刻要注意auto并不是一个真正的类型。
    auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。