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

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

突然之间STL迭代器,以及任何使用模板的东西都可以轻松地写出10倍。 感觉就像我使用Python这样的“有趣”的语言。

这个关键字在哪里一直是我的一生? 你会冲我的梦想说,这是独家视觉工作室或不便携式?

auto是C ++从C“inheritance”的关键字,C几乎是永远存在的,但实际上从来没有使用过,因为只有两种可能的条件:它不被允许,或者默认情况下被假定。

使用auto来表示推导types是C ++ 11(以前称为C ++ 0x)的新增function。 由于C ++ 11标准最近才出版,可能还有一些编译器还没有被更新以便了解它(还)。

同时, auto x的function与模板types演绎对函数模板的作用几乎一样。 考虑一个像这样的函数模板:

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

在A点,一个types已经被赋值给T根据传递给参数的值。 当你做auto x = some_expression; ,使用基本上相同types的演绎机制来确定用于初始化some_expression的types的x的types。

这意味着编译器需要实现auto大多数types推导机制已经存在,并且用于任何编译器上的模板,甚至可以尝试实现C ++ 98/03。 因此,即使对那些不支持C ++ 11的编译器来说,增加对auto支持也可能相当快捷。

当这个答案是最初写的(2011年,在C ++ 11标准的墨水干燥之前), auto已经非常便携了。 如今,它在所有主stream编译器中都是可移植的。 如果你需要编写与C编译器兼容的代码,或者你有特定的需求来定位一些你知道不支持的编译器(比如,一些人仍然编写代码)对于使用Borland,Watcom等的编译器的MS-DOS,几十年来还没有看到重大的升级)。

这只是一个普遍没用的关键字,并给它一个新的,更好的function。 它是C ++ 11中的标准,大多数C ++编译器甚至支持一些C ++ 11支持。

这个function并没有在你的整个生活中。 自2010版以来,它在Visual Studio中受到支持。 这是一个新的C + + 11function,所以它不是唯一的Visual Studio和/将是可移植的。 大多数编译器已经支持它。

它不会在任何地方……这是C ++ 11实现中的一个新的标准C ++特性。 这就是说,虽然它是简化对象声明以及清除某些调用范例(即基于范围的for循环)的语法的绝妙工具,但请勿过度使用/滥用它:-)

对于variables,指定正在声明的variables的types将从其初始化程序中自动推断出来。 对于函数,指定返回types是一个尾随返回types,或者从它的返回语句(从C ++ 14开始)推导出来。

句法

 auto variable initializer (1) (since C++11) auto function -> return type (2) (since C++11) auto function (3) (since C++14) decltype(auto) variable initializer (4) (since C++14) decltype(auto) function (5) (since C++14) auto :: (6) (concepts TS) cv(optional) auto ref(optional) parameter (7) (since C++14) 

说明

1)在块范围,命名空间范围,for循环的初始化语句等中声明variables时,可以使用关键字auto作为types说明符。 一旦确定了初始化程序的types,编译器就会使用从函数调用(参见模板参数推导#其他上下文获取详细信息)中的模板参数推导规则来确定将replace关键字auto的types。 关键字auto可能伴随着修饰符,例如const或者&,它们将参与types推导。 例如,给定const auto& i = expr; ,如果函数调用f(expr)被编译,那么i的types就是虚构模板template<class U> void f(const U& u)中的参数u的typestemplate<class U> void f(const U& u) 。 因此,根据初始值设定项,可以将auto &&推导为左值参考值或右值参考值,在基于范围的for循环中使用。 如果auto用于声明多个variables,则推导出的types必须匹配。 例如,声明auto i = 0, d = 0.0; 是不合格的,而声明auto i = 0, *p = &i; 结构良好,自动推导为int。

2)在使用尾部返回types语法的函数声明中,关键字auto不执行自动types检测。 它只是作为语法的一部分。

3)在不使用尾部返回types语法的函数声明中,关键字auto指示返回types将使用模板参数推导的规则从其返回语句的操作数中推导出来。

4)如果variables的声明types是decltype(auto),则关键字auto用其初始值设定项的expression式(或expression式列表)replace,实际types使用decltype的规则推导出来。

5)如果函数的返回types被声明为decltype(auto),则关键字auto用其return语句的操作数replace,实际的返回types使用decltype的规则推导出来。

6)forms为auto ::的嵌套名称说明符是一个占位符,它被一个类或枚举typesreplace,遵循约束types占位符推导的规则。

7)lambdaexpression式中的参数声明。 (自C ++ 14以来)函数参数声明。 (概念TS)

注意在C ++ 11之前,auto具有存储持续时间说明符的语义。 在auto f() -> int, i = 0; 不允许。

欲了解更多信息: http : //en.cppreference.com/w/cpp/language/auto