auto C和C++中一个有意思的关键字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yp18792574062/article/details/86756644

一、C语言和C++11之前的auto

C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别,在C语言和C++11之前,auto表示一个变量为自动变量,在函数内部定义变量时,如果没有声明为其它类型的变量,那么默认就是auto的,但是在函数外部会报错。

例如:

// main.cpp

#include <iostream>
// auto int j; 会报错
int main() {
    auto int i = 3;
    std::cout << i << std::endl;
    return 0;

 }
编译:g++ main.cpp -std=c++03

二、C++11中的auto

在C++11中,auto表示自动类型推导,可以使用auto类型对变量的类型进行自动推倒

例如:auto sum = 0;

就会将sum自动推导为int类型

但是在C++11中,auto有着几种不能推导的类型

1、对于一个函数来说,auto不可以是形参类型

例如:int Sum(auto number_one,auto number_two){...} 这样在编译的时候就会报错

2、对于结构体来说,非静态成员变量不能是auto的

例如:struct Point{

        auto x = 3;

        auto y = 4;

};

3、声明auto数组

例如:auto array[] = {1,2,3};

4、auto作为函数的返回类型

例如:auto Sum(int number_one,int number_two){ return number_one + number_two;}

5、在实例化模板的时候,auto作为模板参数

例如:std::vector<auto> v{1,2,3};

三、C++14中的auto

C++14中的auto争对C++11中的两种不能推导的类型做出了一些改变

1、auto作为函数的返回类型

// main.cpp

#include <iostream>

auto Sum(const int number_one,const int number_two){

    return number_one + number_two;

}

int main() {

    std::cout << Sum(3,4) << std::endl;

}

编译:g++ main.cpp -std=c++14

2、auto作为函数的形参

将上面的例子,形参类型改为auto

// main.cpp

#include <iostream>

auto Sum(const auto& number_one,const auto& number_two){

    return number_one + number_two;

}

int main() {

    std::cout << Sum(3,4) << std::endl;

    std::cout << Sum(3.1,4.1) << std::endl;

    std::string str1 = "hello ";

    std::string str2 = "world!";

    std::cout << Sum(str1,str2) << std::endl;

}

这个时候auto就和模板函数类似了

编译:g++ main.cpp -std=c++14 -fconcepts

auto真的是一个很神奇的关键字,欢迎大家有好玩的东西一起分享

猜你喜欢

转载自blog.csdn.net/yp18792574062/article/details/86756644
今日推荐