C++11 auto

一 auto含义新变化

C++11中,auto不再是一个存储类型指示符,而是作为一个新的类型指示符。

二 cv属性

volatile和const代表了变量的两种不同的属性:易失的和常量的,在C++标准中,他们常被叫做cv限制符,C++11规定auto可以与cv限制符一起使用,不过申明为auto的变量并不能从其初始化表达式中“带走”cv限制符。auto 和 auto * 没有区别,如果要使得auto申明的变量是另一个变量的引用,则必须使用auto &(会带走cv限制符)

三 auto使用场景

目前常用的几个场景如下:

1、容器的iterator

std::vector<std::string> vs;
for (auto i = vs.begin(); i != vs.end(); i++)
{
    //dosth
}

2 模板函数

template <typename T1,typename T2>
void Multiply(T1 a,T2 b)
{
    auto c = a + b;
    std::cout << c;
}

// 返回值
template<class T, class U>
auto add(T t, U u) { return t + u; }

// 完美转发
template<class F, class... Args>
decltype(auto) PerfectForward(F fun, Args&&... args) 
{ 
    return fun(std::forward<Args>(args)...); 
}

3 std::bind返回值

……
auto f = std::bind(fn, _1, _2);
……

4 lambda表达式

 auto lambda = [](int x) { return x + 3; };

四 简单举例

(并不是auto的常见用法,用于比较auto和auto&的差异)

int a1 = 1;
int& a2 = a1;
const int c_a3 = 10;
int a4[4];

auto d1 = a1;
auto d2 = a2;
auto d3 = c_a3;
auto d4 = a4;

cout << "typeid(d1).name: " << typeid(d1).name() << endl;
cout << "typeid(d2).name: " << typeid(d2).name() << endl;
cout << "typeid(d3).name: " << typeid(d3).name() << endl;
cout << "typeid(d4).name: " << typeid(d4).name() << endl;

d1 = 2;
cout << "a1: " << a1 << endl;
d2 = 3;
cout << "a1: " << a1 << endl;
d3 = 11;
cout << "c_a3: " << c_a3 << endl;

auto& d5 = a1;
auto& d6 = a2;
auto& d7 = c_a3;
auto& d8 = a4;

cout << "typeid(d8).name: " << typeid(d8).name() << endl;

d5 = 4;
cout << "a1: " << a1 << endl;
d6 = 5;
cout << "a1: " << a1 << endl;
//d7 = 12;
//cout << "c_a3: " << c_a3 << endl;

结果如下:

特别是auto关于顶层和底层const, auto会忽略顶层const.

const int* const p = &c_a3;
auto p1 = p; // p1 为const int*
auto& p2 = p; // p2 为const int* const&

五 参考

auto

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值