在线文档教程
C++
语言 | Language

auto specifier

自动说明符%28自C++11%29

对于变量,指定要声明的变量的类型将自动从其初始化器中推断出来。对于函数,指定返回类型是尾随返回类型,或者从C++14%29以来的返回语句%28中推导。对于非类型模板参数,指定类型将从C++17%29以来的参数%28中推导出来。

句法

auto variable initializer(1)(since C++11)
auto function -> return type(2)(since C++11)
auto function(3)(since C++14)
decltype(auto) variable initializer(4)(since C++14)
decltype(auto) function(5)(since C++14)
auto ::(6)(concepts TS)
cv(optional) auto ref(optional) parameter(7)(since C++14)
template < auto Parameter >(8)(since C++17)
cv(optional) auto ref(optional) identifier-list initializer ;(9)(since C++17)

解释

1%29在块作用域、命名空间范围、for循环的初始化语句中声明变量时,使用关键字auto可用作类型说明符。

一旦确定了初始化程序的类型,编译器就会确定将替换关键字的类型。auto使用规则模板参数推导从函数调用%28(参见模板参数演绎#其他上下文详情见%29。关键词auto可以附带修饰符,例如const或&,它将参与类型扣减。例如,给定const auto& i = expr;,类型i正是参数的类型。u在想象的模板中template<class U> void f(const U& u)如果函数调用f(expr)是被汇编出来的。因此,auto&&可以根据初始化器推导出作为lvalue引用或rvalue引用的方法,该初始化器用于基于范围的for循环中。

如果auto用于声明多个变量,所推导的类型必须匹配。例如,声明auto i = 0, d = 0.0;是不正确的,而声明auto i = 0, *p = &i;格式良好,并且auto被演绎为int...

2%29功能声明,它使用尾部返回类型语法(关键字)。auto不执行自动类型检测。它只作为语法的一部分。

3%29功能声明,它不使用后缀返回类型语法(关键字)。auto指示将从其操作数中推断返回类型。返回语句使用规则模板参数推导...

4%29如果变量的声明类型是decltype(auto),关键字auto的表达式%28或表达式列表%29替换,并使用解密型...

5%29如果声明函数的返回类型decltype(auto),关键字auto被替换为其返回语句的操作数,并使用解密型...

6%29表格的嵌套名称说明符auto::的类或枚举类型替换的占位符。约束型占位符扣除。

7%29 a参数声明Lambda表达.%28自C++14%29 A功能参数申报。28%概念TS%29

8%29模板参数宣告auto,它的类型是从相应的参数推导出来的。

9%29 A结构化绑定声明

注记

直到C++11,auto具有a的语义存储持续时间说明符...

混合auto变量和函数在一个声明中,如auto f() -> int, i = 0;是不允许的。

这个示例显示了使用一个实现的输出,其中type info::name打印完整的类型名称;如果使用gcc或类似的,则通过c++FILT-t筛选。

二次

#include <iostream> #include <cmath> #include <typeinfo> template<class T, class U> auto add(T t, U u) -> decltype(t + u) // the return type 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 c = {1, 2}; std::cout << "type of c: " << typeid(c).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'; // auto int x; // error as of C++11: "auto" is no longer a storage-class specifier }

二次

可能的产出:

二次

type of a: int type of b: double type of c: std::initializer_list<int> my_lambda: 8 type of my_fun: double (*)(double) my_fun: 0.14112

二次

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/language/AUTO