Open jianjieluo opened 8 years ago
[toc]
C++11中引入的auto主要有两种用途:自动类型推断和返回值占位,主要可以简化我们的代码书写。
可以把auto看成是一个自动的变量类型,使用的时候可以方便地自动推断变量的类型
auto a = 10; auto b = "string"; auto c = 10.0;
这样子都是合法的。下面是一些灵活使用的例子
template <class T1, class T2> void Multiply(T1 a, T2 b) { auto v = a * b; }
int size_ = len.size();
在编译的时候往往会收到一条警告:提示你不能够比较两个类型不同的变量,那是因为size()函数所返回的是一个size_type的类型而不是int的类型,这个时候使用auto可以比较容易解决这个问题
auto size_ = len.size();
如果一个表达式中已经有了size()函数就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。
在写函数的时候,返回值类型那里用auto替代,则可以自动判断函数返回值的类型,这十分有利于泛型编程的实现。
template <typename T1, typename T2> auto compose(T1 t1, T2 t2) -> decltype(t1 + t2) // -> 是返回值后置的用法 { return t1+t2; } auto v = compose(2, 3.14); // v's type is double
在遍历数组的时候也可避免出现指针类型出现混乱:
int ia[3][4]; // 在这里把ia的元素都赋值。。。。 for (auto p = ia; p != *ia + 4; ++p) { for (auto q = *p; q != *p + 4; ++q) { std::cout << *q << ' '; std::cout << std::endl; } }
1、用auto声明的变量必须初始化
auto a;
这样是不被允许的 2、auto不能与其他类型组合连用
auto int p; // error
3\函数和模板参数不能被声明为auto
void myFun(auto parameter){} // error template<auto T> // utter nonsense - not allowed void Fun(T t){}
4、不能用auto来进行强制类型转换
auto x2 = (auto)value; // no casting using auto
5、 定义在一个auto序列的变量必须始终推导成同一类型
auto x1 = 5, x2 = 5.0, x3='r'; // error auto x1 = 5, x2 = 113, x3 = 233; // right
(ps:觉得不全,可能会更新。。。。)
// 为什么没有点赞功能
[toc]
auto 的基础学习
C++11中引入的auto主要有两种用途:自动类型推断和返回值占位,主要可以简化我们的代码书写。
1、自动推断类型
可以把auto看成是一个自动的变量类型,使用的时候可以方便地自动推断变量的类型
这样子都是合法的。下面是一些灵活使用的例子
A
B 大家在使用stl容器的时候应该会碰到这样的情况,大家出于习惯会这样写:
在编译的时候往往会收到一条警告:提示你不能够比较两个类型不同的变量,那是因为size()函数所返回的是一个size_type的类型而不是int的类型,这个时候使用auto可以比较容易解决这个问题
如果一个表达式中已经有了size()函数就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。
2、用auto和decltype简化声明
在写函数的时候,返回值类型那里用auto替代,则可以自动判断函数返回值的类型,这十分有利于泛型编程的实现。
在遍历数组的时候也可避免出现指针类型出现混乱:
3、注意事项:
1、用auto声明的变量必须初始化
这样是不被允许的 2、auto不能与其他类型组合连用
3\函数和模板参数不能被声明为auto
4、不能用auto来进行强制类型转换
5、 定义在一个auto序列的变量必须始终推导成同一类型
(ps:觉得不全,可能会更新。。。。)