小编典典

C++ 自动关键字。为什么是魔法?

all

从我用来学习 C++
的所有材料中,auto一直是一个奇怪的存储持续时间说明符,没有任何用途。但就在最近,我遇到了将它本身用作类型名称的代码。出于好奇,我尝试了它,它假定我碰巧分配给它的类型!

突然之间,STL 迭代器以及任何使用模板的东西都变得更容易编写了 10 倍。感觉就像我在使用像 Python 这样的“有趣”语言。

我的一生都在哪里?你会说它是视觉工作室独有的还是不便携的,这会打破我的梦想?


阅读 66

收藏
2022-07-13

共1个答案

小编典典

auto是 C++ 从 C 中“继承”的一个关键字,它几乎永远存在,但实际上从未使用过,因为只有两个可能的条件:要么是不允许的,要么是默认假设的。

使用autoto 表示推导类型是 C++11 的新功能。

同时,从类型的auto x = initializer类型推导类型的方法与模板类型推导对函数模板的工作方式相同。考虑这样的函数模板:x``initializer

template<class T>
int whatever(T t) { 
    // point A
};

在点 A 处,已T根据为参数传递的值分配了一个类型 to whatever。当你这样做auto x = initializer;时,相同的类型推导用于xinitializer用于初始化它的类型中确定类型。

这意味着编译器需要实现的大多数类型推断机制auto已经存在并用于任何编译器上的模板,甚至尝试实现
C++98/03。因此,对于基本上所有的编译器团队来说,添加对 的支持auto显然相当容易——它添加得非常快,而且似乎也几乎没有与之相关的错误。

最初编写此答案时(在 2011 年,在 C++ 11
标准上墨迹未干之前)auto已经非常便携。如今,它在所有主流编译器中完全可移植。避免它的唯一明显原因是,如果您需要编写与 C
编译器兼容的代码,或者您有特定的需要针对一些您知道不支持它的利基编译器(例如,仍然有一些人编写代码对于 MS-DOS,使用 Borland、Watcom
等的编译器,几十年来没有出现重大升级)。如果您使用的是任何主流编译器的合理当前版本,那么完全没有理由避免它。

该标准的最新修订版增加了一些auto可以使用的新地方。从 C++14 开始,您可以使用autolambda 的参数类型:

    [](auto s) { return s + 1; }

这与上面的示例基本相同——尽管它没有明确使用template语法,但这基本上是一个模板,它推断参数的类型,并在该类型上实例化模板。

这非常方便和有用,以至于在 C++20 中,为普通函数添加了相同的功能,而不仅仅是 lambda。

但是,就像以前一样,所有这些实际上都归结为使用自 C++98
以来我们用于函数模板的相同基本类型推导机制。auto允许它在更多地方使用,更方便,但底层的繁重工作保持不变。

2022-07-13