gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:33:43 25 4
gpt4 key购买 nike

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

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

我的一生都在哪里?你会说它是 Visual Studio 独有的还是不可移植的,这会打破我的梦想?

最佳答案

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

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

同时,auto x = initializerinitializer的类型推导出x的类型,和模板类型推导一样适用于功能模板。考虑这样的函数模板:

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

在 A 点,已根据传递给 whatever 的参数值将类型分配给 T。当您执行 auto x = initializer; 时,将使用相同的类型推导来从 initializer 的类型中确定 x 的类型。初始化它。

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

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

该标准的最新修订版添加了一些可以使用 auto 的新位置。从 C++14 开始,您可以使用 auto 作为 lambda 的参数类型:

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

这和上面的例子本质上是一样的——尽管它没有显式使用 template 语法,这基本上是一个模板,它推断参数的类型,并实例化模板超过那个类型。

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

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

关于C++ 自动关键字。为什么是魔法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7576953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com