有没有理由在C++ 03中使用'auto'关键字?

Car*_*ers 84 c++ keyword c++03

请注意,此问题最初发布于2009年,在C++ 11批准之前以及auto关键字的含义发生重大变化之前.提供的答案仅适用于C++ 03的含义auto- 即指定的存储类 - 而不是C++ 11的含义auto- 即自动类型推导.如果您正在寻找有关何时使用C++ 11的建议auto,则此问题与该问题无关.

在最长的时间里,我认为没有理由static在C中使用关键字,因为在块范围之外声明的变量是隐式全局的.然后我发现static在块范围内声明一个变量会给它一个永久的持续时间,并且在块范围之外(在程序范围内)声明它会给它文件范围(只能在该编译单元中访问).

所以这给我留下了一个我可能还没有完全理解的auto关键字:关键字.除了"局部变量"之外还有其他一些含义吗?无论你想在哪里使用它,它都没有隐含地为你做的事情?auto变量如何在程序范围内表现?static auto文件范围中的变量是什么?此关键字除完全性之外是否还有其他目的?

std*_*ave 86

在C++ 11中,auto具有新的含义:它允许您自动推导变量的类型.

为什么这有用?让我们考虑一个基本的例子:

std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
  // Do stuff here
}
Run Code Online (Sandbox Code Playgroud)

auto那里创建类型的迭代器std::list<int>::iterator.

这可以使一些非常复杂的代码更容易阅读.

另一个例子:

int x, y;
auto f = [&]{ x += y; };
f();
f();
Run Code Online (Sandbox Code Playgroud)

在那里,auto推导出将lambda表达式存储在变量中所需的类型.维基百科对此主题有很好的报道.

  • 我不知道你,但我发现这比迭代器类型垃圾邮件更容易阅读. (38认同)
  • 如果对于某些共鸣,zou决定将类从list <int>更改为其他类,则不必搜索每个迭代器声明并进行更改. (17认同)
  • 仍然不确定这是否是一个很好的使用汽车.代码应该易于阅读,不易编写! (4认同)
  • @darth`const auto it = a.begin();`会给你一个const`theerator`,而不是`const_iterator`.你仍然可以改变元素,但是`++ it`将无法编译.要获得`const_iterator`,你可以使用`auto it = a.cbegin();` (4认同)
  • @KarateSnowMachine:如果你想要const,你会使用"const auto"而不是"auto". (2认同)

Joh*_*itb 74

auto是一个存储类说明,static,registerextern也.您只能在声明中使用这四种中的一种.

局部变量(没有static)具有自动存储持续时间,这意味着它们从定义的开始直到它们的块结束.将auto放在它们前面是多余的,因为无论如何这是默认值.

我不知道有什么理由在C++中使用它.在具有隐式int规则的旧C版本中,您可以使用它来声明变量,如:

int main(void) { auto i = 1; }
Run Code Online (Sandbox Code Playgroud)

i在范围内的情况下,使其成为有效的语法或从赋值表达式中消除歧义.但无论如何这在C++中都不起作用(你必须指定一个类型).有趣的是,C++标准写道:

在块作用域中声明没有存储类说明符或声明为函数参数的对象默认具有自动存储持续时间.[注意:因此,自动说明符几乎总是多余的,不经常使用; auto的一个用途是明确区分声明语句和表达式语句(6.8). - 结束说明]

它指的是以下场景,它可以是具有冗余括号的类型变量的a转换int或声明.它总是被认为是一个声明,所以不会在这里添加任何有用的东西,而是为人类添加.但话说回来,人们会更好地去除周围多余的括号,我会说:aintaautoa

int(a);
Run Code Online (Sandbox Code Playgroud)

随着auto使用C++ 0x到达的新含义,我不鼓励在代码中使用C++ 03的含义.

  • @Max - 嘿,很多人说"双u双-u-double-u"是"万维网"的缩写. (30认同)
  • 最好的部分是程序员用来写"auto"(四个字母)来保存自己不会写"int"(三个字母). (29认同)
  • C++编译器通常用于为函数的返回值设置隐式int,在标准之前的ARM日期......在EMPIRE之前...... (4认同)
  • @smichak不,"volatile"是一个类型限定符.它不是确定存储值的位置,而是改变写入和读取volatile限定类型的对象的行为.可以存在volatile限定堆栈变量(自动存储类)以及volatile限定静态存储持续时间变量(本地"静态"存储类,非局部变量).除此之外,我不知道"注册易失性"是否是一个有效的组合:) (3认同)

Dan*_*ker 34

auto关键字目前没有用处.你是完全正确的,它只是重述一个局部变量的默认存储类,这是一个非常有用的替代方案static.

它在C++ 0x中具有全新的含义.这让你知道它是多么无用!


qrd*_*rdl 7

GCC特别auto适用于嵌套函数 - 请参见此处.

如果您在定义之前要调用嵌套函数,则需要使用它来声明它auto.