理解C++的auto类型推导

Last Updated: 2023-12-26 11:12:26 Tuesday

-- TOC --

我们习惯了在申明变量类型,或者函数返回类型的时候,都显示地写出类型名称,比如int,char,unsigned long等等。。。在C++中,可以使用auto关键词来让编译器替我们干这个输入类型的活儿。

其实auto这个申明一直都存在,在C++11之前,包括C语言,它都表示这个变量是一个automatic variable,即由编译期在stack中创建的变量。但是实际上,auto申明几乎用不到,函数内部定义的变量,都是automatic的!从C++11开始,关键词auto焕发新生...

C++中的auto,不是自动类型,而是让编译器自动把类型通过上下文推导出来,auto is not a type!

比如:

int x = 42;
auto y = 42;  // 42 is int, so y is int

编译器一看是42,这是int类型,于是就自动地给y设置为int类型的对象。

再比如:

auto the_answer { 42 }; // int
auto foot { 12L }; // long
auto rootbeer { 5.0F }; // float
auto cheeseburger { 10.0 }; // double
auto politifact_claims { false }; // bool
auto cheese { "string" }; // const char*

auto可以节省很多typing的工作,特别是在使用stdlib中的containers的时候。

Alone, all of this simple initialization help doesn’t buy you much; however, when types become more complicated—for example, dealing with iterators from stdlib containers—it really saves quite a bit of typing. It also makes your code more resilient to refactoring.

auto让代码变得简单(一看到auto,就知道这里的type没问题,编译器搞定),还可以减少代码重构时的修改工作量。

The auto keyword assists in making code simpler and more resilient to refactoring.

看一下这段测试代码,使用了C++的range-based for loop:

$ cat test_for.cpp
#include <cstdio>

struct abc {
    int a;
    int b;
};

void change(abc& g) {
    g.a = 1;
    g.b = 5;
}

int main(void) {
    abc a[4];
    for (auto &i: a) {
        change(i);
        printf("%d %d\n", i.a, i.b);
    }
    return 0;
}
$ g++ -Wall -Wextra test_for.cpp -o test_for
$ ./test_for
1 5
1 5
1 5
1 5

假设类型名称发生变化,至少在for循环这部分,不需要做任何修改。

本文链接:https://cs.pynote.net/sf/c/cpp/202208192/

-- EOF --

-- MORE --