c++11之特性了解auto(书:深入应用c++11)

1.考虑到auto在c++中使用很少,在c++11中,auto关键字不再表示存储类型指示符(static int 和auto int是相对的 )。而改成了一个类型指示符,用于编译器自动推导变量类型。

2.

2.1auto可以直接推导出指针

2.2可以使用cv限定符(const、volatile)

2.3表达式带有cv限定符时,会丢弃cv限定符。

2.4auto和引用或者指针结合时,将保留cv限定符属性。

const auto e = 0;
auto f = e;            // f -> int

const auto & g = e;
auto h = g;            // g -> const int&

实际上auto的推导规则类似于函数模板。

3.auto的限制

3.1auto不能用于函数参数。

3.2auto不能用于非静态成员变量。

3.3auto无法定义数组

3.4无法推导模板参数

void fun(auto a = 1){};  //error  不能用于函数参数
class MyClass
{
    auto val = 0;                    // error  不能用于非静态成员变量
    static const auto val2 = 0;      // ok
};
auto szMy[20];           // error 不能用于数组

template<typename T>
struct Bar{};

Bar<int> bar;
Bar<auto> bar = bar;     // error 无法推导出模板参数

4.auto推导数组时,会像函数参数那样退化成指针。

int szMy1[10] = {0};
auto szMy2 = szMy1;        // szMy2 -> int*

5.常用位置

5.1代替stl中复杂的迭代器,简化代码

std::map<int,double> mapMy1;
std::map<int,double>::iterator it = mapMy1.begin();
auto my = mapMy1.begin();  // auto替代迭代器

// 写法1,用于删除特定内容
for(auto &my = mapMy1.begin();my != mayMy1.end();)
{
    if(...)
    {
        ++ my;        // 非标准类型++my优于my++
    }
    else
    {
        my = mapMy1.erase(my);
    }
}
// 写法2,用于读取所有内容
for(auto &my : mapMy1)    // &减少了一次拷贝
{
    ...
}

5.2 可以简化函数定义

class Foo
{
public:
    static int get(void)
    {
        return 0;
    }
};

class Eoo
{
public:
    static const char* get(void)
    {
        return "0";
    }
};

template<typename A>
void func(void)
{
    auto val = A::get();
}

int main()
{
    func<Foo>();    // 推导出val的类型为int
    func<Eoo>();    // 推导出val的类型为char*
    return;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luiio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值