admin管理员组

文章数量:1446756

【C++11】auto && decltype && nullptr

Ⅰ. auto

​ 在 C++98auto 是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以 auto 就没什么价值了。

​ 所以 C++11 中废弃 auto 原来的用法,将其用于实现自动类型推导。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

代码语言:javascript代码运行次数:0运行复制
int main()
{
    int i = 10;
    auto p = &i;
    auto pf = strcpy;
    
    cout << typeid(p).name() << endl;
    cout << typeid(pf).name() << endl;
    
    map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
    //map<string, string>::iterator it = dict.begin();
    auto it = dict.begin();
    
    return 0; 
}

​ 易错点:

代码语言:javascript代码运行次数:0运行复制
#include<iostream>
#include<vector>

// 4. vs2013不支持函数形参是auto变量,而qt可以
void func(auto a)
{
    //.....
}

// 5. auto变量不能作为自定义类型的成员变量
struct test
{
    int a;
    auto b=10;
};

int main()
{
    // 1. 定义变量时,必须初始化
    auto a; // ❌
    a = 10;

    // 2. 不能是auto数组
    auto b[3] = {1, 2, 3}; // ❌

    // 3. 模板实例化类型不能是auto类型
    std::vector<int> a;
    std::vector<auto> b = { 1 }; // ❌

    return 0;
}

Ⅱ. decltype

auto 使用的前提是:必须要对 auto 声明的类型进行初始化,否则编译器无法推导出 auto 的实际类型。但有时候可能需要根据表达式运行完成之后结果的类型进行推导,因为编译期间,代码不会运行,此时 auto 也就无能为力。

本文标签: C11auto ampamp decltype ampamp nullptr