C++日记——Day61:auto类型推断,auto应用场合

特点:

1、auto自动类型推断发生在编译期,所以不会影响程序执行期间的性能;

2、auto定义变量必须立即初始化,这样编译器才能推断它的实际类型。那么编译的时候才能确定auto的类型和整个变量的类型,然后在编译期间就可以用真正的类型替换掉auto这个类型占位符。

3、auto的使用灵活,和指针 和引用 和const 等限定符结合使用。

 

auto类型推导出来一个具体类型。auto实际上是一个类型,那么这里的auto实际上就相当于模板函数推导里边的类型模板参数T。所以auto这个东西也是类型声明的一部分。

a)传值方式(非指针,非引用):传值时引用类型会被抛弃,const属性也会被抛弃,对方看成新副本

auto x = 27;
const auto x2 = x;

b)指针或者引用类型但不是万能引用,不会抛弃const等限定符,但是会丢弃引用

const auto &xy = x; // xy = const int & , auto = int
auto xy2 = xy;  //xy2 = int, auto = int  传值时引用类型会被抛弃,const属性也会被抛弃,对方看成新副本

auto &xy3 = xy; //xy3 = const int &, auto = const int ,引用被丢弃,但const属性会保留,(因为此处为 &xy3,所以auto会继承const属性)

auto y = new auto(100);

const auto *xp = &x; //xp = const int *, auto = int

auto *xp2 = &x; xp2 = int *, auto = int;

auto xp3 = &x; //xp3 = int *, auto = int *

 

c)万能引用类型

int x = 19;
auto&& wnyy1 = x; // x是左值, auto = int &, wnyy1 = int &
auto&& wnyy2 = x2; // x2是左值,auto = int& , wnyy2 = const int &
auto&& wnyy3 = 100; // auto = int ,wnyy3 = int &&

 

三:auto针对数组和函数的推断

const char mystr[] = "I love China";
auto myarr = mystr; // const char * 
auto &myarr2 = mystr; // const char (&)[14] 这里变成了数组的引用,应该是此处mystr不代表字符串数组的首地址了


int a[2] = {1, 2};
auto aauto = a; // aauto = int * , auto = int *


void myfunc3
{

}

auto tmpf = myfunc3; // void (*) (double, int) 函数指针
auto &tmpf2 = myfunc3; //void (&) (double, int) 函数引用

 

四、std::initializer_list<int>

auto x = 10; // int
auto x2(20); // int 
auto x3 = {39}; // std::initializer_list<int> 这是一个针对auto的特殊推倒
auto x4{12}; // int

auto遇到 = {} 时推倒规则就不一样了。

std::initializer_list<int> C++11引入的新类型,表示某种特定的值得数组。这种推倒指适用于auto,不适合模板类型。这一点是auto类型推倒和模板推倒的区别之处。

 

auto func()
{
    return 12; // 也可以
}

 auto还可以放在函数返回类型的位置上。

 

class CT{
public:
    auto m_i = 12; //报错,普通成员变量不能是auto类型。
    static const auto m_si = 15; //static const可以使用auto,其值必须在类内初始化              
}

void func(void x, int y){

}

 

auto不适用场合:

1、auto不能用于函数参数

2、普通成员变量不可以是auto类型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章