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。