auto标识符(C++11起)

来自cppreference.com
< cpp‎ | language
 
 
C++语言
表达式
替代表示
字面量
布尔型 - 整型 - 浮点型
字符型 - 字符串 - nullptr (C++11)
用户定义 (C++11)
Utilities
属性 (C++11)
Types
typedef声明
类型别名声明 (C++11)
Casts
隐式类型转换 - 显示类型转换
static_cast - dynamic_cast
const_cast - reinterpret_cast
内存分配
类特有的函数属性
静态成员函数
模板
杂项
 

标识出被声明的变量类型将会从它的初始化中自动推导得出。对于函数而言,标识出返回值类型是后置的返回值类型。

目录

[编辑] 语法

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