一文详解C++11中auto的使用

 更新时间:2023年07月02日 16:31:25   作者:fengbingchun  
这篇文章主要为大家分享一下C++11中auto关键字的使用示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

在C语言中,就有了auto关键字,它被当作是一个变量的存储类型修饰符,表示自动变量(局部变量)。它不能被单独使用,否则编译器会给出警告。在C++11标准中,添加了新的类型推导特性。在C ++11中,使用auto定义的变量不能使用其它类型修饰符修饰,该变量的类型由编译器根据初始化数据自动确定。

C++中类型检查是在编译阶段。动态类型语言能做到在运行时决定类型,主要归功于一技术,这技术是类型推导。在C++11中,可以通过重定义auto关键字来实现类型推导。

在C++11中,使用auto关键字可以要求编译器对变量的类型进行自动推导。

auto关键字:类型推导,从该关键字的初始化表达式中推导变量的类型。

在块作用域、命名空间作用域、for循环的初始化语句内声明变量的时候,变量的类型可以被省略,使用关键字auto来代替。

auto声明的变量必须被初始化,以使编译器能够从其初始化表达式中推导出其类型。

声明为auto的变量在编译时期就分配了内存,而不是到了运行时期,所以使用auto不再引发任何速度延迟,这也意味着使用auto的时候,这个变量不初始化会报错,因为编译器无法知道这个变量的类型。

auto使用时需注意:

(1)、可以使用const、volatile、pointer(*)、reference(&)、rvalue reference(&&)等说明符和声明符来修饰auto关键字;

(2)、用auto声明的变量必须初始化;

(3)、auto不能与其它任何类型说明符一起使用;

(4)、方法、参数或模板参数不能被声明为auto;

(5)、定义在堆上的变量,使用了auto的表达式必须被初始化;

(6)、auto是一个占位符,不是类型,不能用于类型转换或其它一些操作,如sizeof、typeid;

(7)、auto关键字内声明的声明符列表的所有符号必须解析为同一类型;

(8)、auto不能自动推导成CV-qualifiers(constant& volatile qualifiers),除非被声明为引用类型;

(9)、auto会退化成指向数组的指针,除非被声明为引用;

(10)、auto不能作为函数的返回类型,在C++14中是可以的。

建议:大多数情况使用关键字auto,除非非常需要转换。

下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

#include "auto.hpp"
#include <iostream>
#include <cmath>
#include <typeinfo>
#include <string>
#include <map>
#include <list>
#include <deque>
#include <vector>
//
// reference: http://en.cppreference.com/w/cpp/language/auto
template<class T, class U>
auto add(T t, U u) -> decltype(t + u) // the return type is the type of operator+(T, U)
{
	return t + u;
}
auto get_fun(int arg) -> double(*)(double) // same as: double (*get_fun(int))(double)
{
	switch (arg) {
		case 1: return std::fabs;
		case 2: return std::sin;
		default: return std::cos;
	}
}
int test_auto1()
{
	auto a = 1 + 2;
	std::cout << "type of a: " << typeid(a).name() << '\n'; // type of a: int
	auto b = add(1, 1.2);
	std::cout << "type of b: " << typeid(b).name() << '\n'; // type of b: double
	auto c = { 1, 2 };
	std::cout << "type of c: " << typeid(c).name() << '\n'; // type of c: class std::initializer_list<int>
	auto my_lambda = [](int x) { return x + 3; };
	std::cout << "my_lambda: " << my_lambda(5) << '\n'; // my_lambda: 8
	auto my_fun = get_fun(2);
	std::cout << "type of my_fun: " << typeid(my_fun).name() << '\n'; // type of my_fun: double (__cdecl*)(double)
	std::cout << "my_fun: " << my_fun(3) << '\n'; // my_fun: 0.14112
	// auto int x; // error as of C++11: "auto" is no longer a storage-class specifier // error C3530: “auto”不能与任何其他类型说明符组合
	return 0;
}
// reference: https://msdn.microsoft.com/zh-cn/library/dd293667(v=vs.120).aspx
int f(int x) { return x; }
int test_auto2()
{
	int count = 10;
	int& countRef = count;
	auto myAuto = countRef;
	countRef = 11;
	std::cout << count << " " << std::endl; // 11
	myAuto = 12;
	std::cout << count << std::endl; // 11
	// 1. 下面的声明等效。 在第一个语句中,声明 j 变量为类型 int。 在第二个语句,因为初始化表达式 (0) 是整数,所以变量 k 推导为 int 类型
	int j = 0;  // Variable j is explicitly type int.
	auto k = 0; // Variable k is implicitly type int because 0 is an integer.
	// 2. 以下声明等效,但第二个声明比第一个简单
	std::map<int, std::list<std::string>> m;
	std::map<int, std::list<std::string>>::iterator i = m.begin();
	auto i_ = m.begin();
	// 3. 声明 iter 和 elem 变量类型
	std::deque<double> dqDoubleData(10, 0.1);
	for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter) { /* ... */}
	// prefer range-for loops with the following information in mind
	// (this applies to any range-for with auto, not just deque)
	for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples 
	{ /* ... */ }
	for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
	{ /* ... */ }
	for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
	{ /* ... */ }
	// 4. 使用 new 运算符
	double x = 12.34;
	auto *y = new auto(x), **z = new auto(&x);
	// 5. 所有符号解析为同一类型
	auto x_ = 1, *y_ = &x_, **z_ = &y_; // Resolves to int.
	auto a(2.01), *b(&a);         // Resolves to double.
	auto c = 'a', *d(&c);          // Resolves to char.
	auto m_ = 1, &n_ = m_;            // Resolves to int.
	// 6. 使用条件运算符 (?:)
	int v1 = 100, v2 = 200;
	auto e = v1 > v2 ? v1 : v2;
	// 7. 将变量 x7 初始化类型 int,将引用的变量 y7 初始化为类型 const int,及将变量 fp 初始化为指向返回类型 int 的函数的指针
	auto x7 = f(0);
	const auto & y7 = f(1);
	int(*p)(int x7);
	p = f;
	auto fp = p;
	return 0;
}
/
// reference: http://www.learncpp.com/cpp-tutorial/4-8-the-auto-keyword/
int add_3(int x, int y)
{
	return x + y;
}
int test_auto3()
{
	auto d = 5.0; // 5.0 is a double literal, so d will be type double
	auto i = 1 + 2; // 1 + 2 evaluates to an integer, so i will be type int
	auto sum = add_3(5, 6); // add_3() returns an int, so sum will be type int
	return 0;
}

GitHubhttps://github.com/fengbingchun/Messy_Test

到此这篇关于一文详解C++11中auto的使用的文章就介绍到这了,更多相关C++11 auto内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++标准库中sstream与strstream的区别详细解析

    C++标准库中sstream与strstream的区别详细解析

    以下是对C++标准库中sstream与strstream的区别进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++ 中的INT_MAX,INT_MIN数值大小操作

    C++ 中的INT_MAX,INT_MIN数值大小操作

    这篇文章主要介绍了C++ 中的INT_MAX,INT_MIN数值大小操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • C语言直接插入排序算法介绍及示例

    C语言直接插入排序算法介绍及示例

    插入排序是把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。插入排序中较简单的种方法是直接插入排序,其插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左依次比较其关键字值的大小
    2022-08-08
  • C语言动态内存泄露常见问题内存分配改进方法详解

    C语言动态内存泄露常见问题内存分配改进方法详解

    今天遇见了一道有意思的内存泄露题目,特地分享给大家,相信屏幕前的你学习完一定有所收获,预祝读者学习愉快,多多进步早日升职加薪
    2021-10-10
  • C语言每日练习之动态显示系统时间

    C语言每日练习之动态显示系统时间

    这篇文章主要介绍了C语言动态显示系统时,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • C语言三子棋一步步实现详程

    C语言三子棋一步步实现详程

    三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了,想用c语言做出这个游戏,事实上也是比较简单的,下面通过c语言进行对五子棋的分析
    2022-02-02
  • C++ Boost Bind库示例分析使用

    C++ Boost Bind库示例分析使用

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言实现企业员工管理系统开发

    C语言实现企业员工管理系统开发

    这篇文章主要为大家详细介绍了C语言实现企业员工管理系统开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 利用Matlab制作一个贼简单的粒子圣诞树

    利用Matlab制作一个贼简单的粒子圣诞树

    圣诞节快到了,本文用Matlab绘制了圣诞树祝你们圣诞节快乐,所以下面这篇文章主要给大家介绍了关于如何利用Matlab制作一个贼简单的粒子圣诞树,需要的朋友可以参考下
    2022-12-12
  • 在C语言中对utmp文件进行查找和写入操作的函数小结

    在C语言中对utmp文件进行查找和写入操作的函数小结

    这篇文章主要介绍了在C语言中对utmp文件进行查找和写入操作的函数小结,包括pututline()函数和getutline()函数以及getutid()函数,需要的朋友可以参考下
    2015-08-08

最新评论