曾几何时,C++ 0x出现在我们眼前,我们还在苦逼的用老的规则写代码,因为我们是码畜,我们的顶头上司要求我们必须用土的掉渣的VS2005来写代码,并且用各种存在很棘手问题的库,还有我们的用户都用的XP,新的库包含一些其他的内容,用户根本都没法用,所以我们依然苦逼着。不过曙光就在眼前了,虽然没看到曙光中的女神,但是先感谢下那帮为C++贡献终生的老头子们。
当年我们学编程的时候记得还有一个auto关键字,是C++ 98标准的,是用来表明具有自动存储期的局部变量,不过这个自动存储期我是木有明白,这个关键字被打入冷宫了。现在那帮old men又重新启用了它,就像武则天和甄嬛一样(我又狗血了,为什么加一个又呢?)。
现在的auto关键字是用来做自动类型推演的,有点类似于类型萃取,不过比类型萃取更简单更好用。
我们在用模板或者容器的时候经常都会写一大堆内容来将函数返回值赋值给某个相应的对象,然后用这个对象做一些操作,其实我们根本关心这个对象是什么类型,我们只是因为不那样写编译器不给通过而已,我们都是被逼的。而现在auto就可以帮我们解决这个烦恼,前面说过了,它的特点是自动类型推演,所以都交给它了。
例如,我们有如下的代码:
#include <map> #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { typedef std::map<int, int> intMap; typedef intMap::iterator intMapIter; intMap myIntMap; for (intMapIter iter = myIntMap.begin(); iter != myIntMap.end(); ++iter) { std::cout << "First: " << iter->first << " Second: " << iter->second << std::endl; } system("pause"); return 0; }
我们写了这么一坨代码,才实现了一个打印的功能,现在我们可以很简单的写了,连typdef都不用,(我认为typedef大多数时候的作用是为了迭代器,而不容器)。
简单的写法如下:
#include <map> #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { std::map<int, int> myIntMap; for (auto iter = myIntMap.begin(); iter != myIntMap.end(); ++iter) { std::cout << "First: " << iter->first << " Second: " << iter->second << std::endl; } system("pause"); return 0; }
明显我们的代码量减少了,我们不是按照行数给钱的,所以不用担心代码减少了。
当然了它不仅仅使用在容器上,再看看下面的例子:
#include <string> #include <iostream> std::string& GetString(std::string&& myString) { return myString; } int _tmain(int argc, _TCHAR* argv[]) { auto tempString = GetString(std::string("Hello World")); std::cout << tempString << std::endl; system("pause"); return 0; }
auto关键字的好处是解决了长期以来令我们头疼并且给我们带来麻烦的返回值数据类型问题。比如在一些复杂的模板函数里,你可以不用纠结这里到底用什么返回值的数据类型,大大的降低了复杂的数据类型的判断难度和代码量。
所以有高端并且简单的东西为何不用呢,与己方便与人方便嘛