Skip to content

C++11 learning summary #18

Description

@jianjieluo

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions