深入浅出c++11之auto

1.首先这是一个关键字这是C++ 语法决定的! auto这个关键字其实在很早的 c++版本就有了,好像是c++98 ,那时的功能很简单,就是表示一个变量的自动生命周期,中间版本又去掉了,但c++11以重新开放出来了,作用已经完全不同了,(你可以理解成字是一样,要表达的功能完全不一样了) 并且重新定义了其功能,变得更强大了!

作用:编译器推导变量的数据类型!

auto的自动类型推断发生在编译期 ! 这个很重要,圈起来!

为什么要引入引功能?

C++11 应该是参考了其实一些语言的特性如C#,python,java script ,可能就是感觉别的语言这个功能感觉很爽,

自己是不是也得整一下,不然不太low了! 

其它语言这样:   var testval=90;

比如我们现在经常使用:定义一个临时变量

auto  abc =6;

auto  test=func();

auto使用限制

1.不能作为函数参数

2.不能用于静态成员变量

3.不能用来定义数组

4.不能用来声明或定义为模板参数

5.不能用于sizeof/typeid操作

6.auto变量 推导类型前后必须一致,比如你定义推导整型, 就是使用后,不要一会推整型,一会又推浮点型,这

是不支持的!

7. auto不能与其他类型组合连用

如:auto int abc =5;  这样肯定不行

auto 使用场景:

1.

before:

	std::vector<int> vs;
	std::vector<int> ::iterator it ;
	for (it = vs.begin(); it != vs.end(); it++)
	{
		//..
	}

auto:
    std::vector<int> vs;
    for (auto i = vs.begin(); i != vs.end(); i++)
    {
        //..
    }

这样写是不是简便很多,当然使用forearch就更简便了!

2.   

在定义模板函数时,用于声明依赖模板参数的变量类型。

template <typename _Tx,typename _Ty>
void Add(_Tx x, _Ty y)
{
    auto sum = x+y;
}

3.

模板函数依赖于模板参数的返回值

template <typename _Tx, typename _Ty>
auto Add(_Tx x, _Ty y)->decltype(x+y)
{
    return x+y;
}

c++ 14已经支持下面这样写了,可以去掉 ->decltype(x+y)   c++ 11必须要 decltype 
template <typename _Tx, typename _Ty>
auto Add(_Tx x, _Ty y)
{
    return x+y;
}

说明一下: 只能说c++11在这个功能上还不是特别强,当模板函数的返回值依赖于模板的参数时,我们无法在编译代码前确定模板参数的类型,所以无法得知返回值的类型,所以c++ 11 又想出了一招,在后面加decltype操作符,
decltype操作符用于查询表达式的数据类型,也是C++11标准引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,通过decltype(x+y)这个延迟推导,auto在这里的作用也称为返回值占位,它只是为函数返回值占了一个位置,真正的返回值是后面的decltype(_Tx+_Ty), 当然c++14 又做了优化了,这里就不作多介绍,假如你使用的编辑器支持更高的c++标准,你也可以采用c++14这样写,更简单直观!

使用时注意事项

1、使用auto关键字的变量必须有初始值。

2.对于数组类型,auto关键字会推导为指针类型,除非被声明为引用。例如:

    int a[10];
    auto b = a;
    cout << typeid(b).name() << endl;   // 输出:int *

    auto &c = a;
    cout << typeid(c).name() << endl;   // 输出:int [10]

3.auto 型变量不跟随引用类型,除非你显式声明才跟随

    int itest = 100;
    int &r = itest;
    auto autoetst = r;
    a = 130; // 重新赋值
    // 输出itest  =100,autoetst =130
    cout << "itest  = " << itest << " autoetst = " << autoetst << endl;   


    // 显式声明
    auto &rb = r;
    rb = 15; // 重新赋值
    cout << "itest = " << itest << "rb = " << rb << endl;    // 输出itest=15,rb=15

4.auto 型变量不跟随const类型,除非你显式声明才跟随

    const int c1 = 10;
    auto c2 = c1;
    c2 = 14; // 正确,c2为int类型,可以修改它的值

    // 显示声明
    const auto c3 = c1;
    c3 = 15; // 报错,c3为const int类型,无法修改const变量

猜你喜欢

转载自blog.csdn.net/kaizi318/article/details/108918743