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;
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页