C++auto 关键字

auto 关键字在 C 语言中就已经存在了,只不过在 C 语言中它的作用是声明自动变量,例如
auto int z = 123 ;
        z 本来是局部变量,加上 auto 后变成了局部的自动变量,就是当前变量的生存周期是由编译器自动决定的,但是这和局部变量没有区别,所以 auto C 语言中并没有发挥什么作用。
        在 C++11 中,就赋予了 auto 一个新的功能-自动类型推导。auto 声明的变量必须由编译器在编译时期推导而得,简单来说就是由编译器来识别变量的类型。
        注意:使用 auto 定义变量时必须对其进行 初始化 ,在编译阶段编译器需要根据初始化表达式来推导 auto 的实际类型。因此 auto 并非是一种 类型 的声明,而是一个类型声明时的 占位符” ,编译器在编译期会将 auto 替换为变量实际的类型。
auto a; //错误,使用 auto 初始化变量必须赋值

auto 使用注意事项

1.不能作为函数参数,例:
void func(auto x, auto y) {}
void func(auto x, double y) {}
int main() 
{
    func(1, 2);
    func(1.2, 1.2);
    return 0;
}
编译报错,影响重载形式下的调用绑定
2.无法作为模板参数
3.无法定义数组
4.不能定义类中的非静态成员变量
5. 当在同一行声明多个变量时,这些变量必须是 相同的类型 ,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
void TestAuto()
{
    auto a = 1, b = 2; 
    auto c = 3, d = 4.0; // 该行代码会编译失败,因为 c 和 d 的初始化表达式类型同
}
6. 用 auto 声明指针类型时,用 auto 和 auto*  没有任何区别 ,但用 auto 声明引用类型时则必须加&,例:
int main()
{
    int x = 10;
    auto a = &x;//与下面 auto* 声明没有区别
    auto* b = &x; //与上面 auto 声明没有区别
    auto c = x; //auto 推导出来是一个 int 型,c 并不会是 x 的引用
    auto& c = x; //正确写法
    return 0;
}
7.auto 会自动去除 const 属性,解释如下:
int main(int argc, char const *argv[])
{
    const int a = 10;
    auto b = a; //b 为 int,不会推导为 const int
    auto c = 'A'; //c 推导为 char,不会推导会 const char
    auto &d = a; //这个时候 d 就会带 const 属性了,因为它是 a 的引用
    return 0;
}

你可能感兴趣的:(C++基础内容概述,c++,开发语言)