auto标识符(C++11 起)
来自cppreference.com
标识出被声明的变量类型将会从它的初始化中自动推导得出。对于函数而言,标识出返回值类型是后置的返回值类型。
目录 |
[编辑] 语法
auto variable initializer (C++11 起) | |||||||||
auto function -> return type (C++11 起) | |||||||||
[编辑] 解释
1) 在块作用域、命名空间作用域、for循环的初始化语句内声明变量的时候,变量的类型可以被省略,使用关键字auto来代替。
一旦初始化类型确定下来,编译器将决定能够替换关键字auto的类型类型,就像使用函数调用时的模板参数推导的规则一样。关键字auto能够伴随着修饰词,例如const或&,它们同样参与推导。例如,const auto& i = expr;,当f(expr)被编译时,i
的类型就是就是假想的模板template<class U> void f(const U& u)中的参数u
的类型。
2) 在函数声明的时候,关键字auto不表示自动类型检测。它仅仅是表示后置返回值的语法的一部分而已。
[编辑] 注释
在 C++11 之前,auto的语义是存储持续性说明。
[编辑] 例子
#include <iostream> #include <cmath> #include <typeinfo> template<class T, class U> auto add(T t, U u) -> decltype(t + u) // the return type of add is the type of operator+(T,U) { return t + u; } auto get_fun(int arg)->double(*)(double) // same as double (*get_fun(int))(double) { switch (arg) { case 1: return std::fabs; case 2: return std::sin; default: return std::cos; } } int main() { auto a = 1 + 2; std::cout << "type of a: " << typeid(a).name() << '\n'; auto b = add(1, 1.2); std::cout << "type of b: " << typeid(b).name() << '\n'; //auto int c; //compile-time error auto d = {1, 2}; std::cout << "type of d: " << typeid(d).name() << '\n'; auto my_lambda = [](int x) { return x + 3; }; std::cout << "my_lambda: " << my_lambda(5) << '\n'; auto my_fun = get_fun(2); std::cout << "type of my_fun: " << typeid(my_fun).name() << '\n'; std::cout << "my_fun: " << my_fun(3) << '\n'; }
输出:
type of a: int type of b: double type of d: std::initializer_list<int> my_lambda: 8 type of my_fun: double (*)(double) my_fun: 0.14112