一、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真的是一个很神奇的关键字,欢迎大家有好玩的东西一起分享