首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

auto specifier

对于变量,指定要声明的变量的类型将自动从其初始化器中推断出来。对于函数,指定返回类型是尾随返回类型,或者从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筛选。

二次

代码语言:javascript
复制
#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
}

二次

可能的产出:

二次

代码语言:javascript
复制
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

二次

代码语言:txt
复制
 ? cppreference.com

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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com