ghostbody / 15-cpp-learning

15 c++ learning repository of SDCS SYSU
6 stars 3 forks source link

C++11 learning summary #18

Open jianjieluo opened 8 years ago

jianjieluo commented 8 years ago

[toc]

auto 的基础学习

C++11中引入的auto主要有两种用途:自动类型推断和返回值占位,主要可以简化我们的代码书写。

1、自动推断类型

可以把auto看成是一个自动的变量类型,使用的时候可以方便地自动推断变量的类型

auto a = 10;
auto b = "string";
auto c = 10.0;

这样子都是合法的。下面是一些灵活使用的例子

A

template <class T1, class T2>  
void Multiply(T1 a, T2 b)  
{  
    auto v = a * b;  
}  

B 大家在使用stl容器的时候应该会碰到这样的情况,大家出于习惯会这样写:

int size_ = len.size();

在编译的时候往往会收到一条警告:提示你不能够比较两个类型不同的变量,那是因为size()函数所返回的是一个size_type的类型而不是int的类型,这个时候使用auto可以比较容易解决这个问题

auto size_ = len.size();

如果一个表达式中已经有了size()函数就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。

2、用auto和decltype简化声明

在写函数的时候,返回值类型那里用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;
    }
}

3、注意事项:

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:觉得不全,可能会更新。。。。)

JohnTargaryen commented 8 years ago
// 为什么没有点赞功能