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表达式存储在变量中所需的类型.维基百科对此主题有很好的报道.
Joh*_*itb 74
auto
是一个存储类说明,static
,register
和extern
也.您只能在声明中使用这四种中的一种.
局部变量(没有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
或声明.它总是被认为是一个声明,所以不会在这里添加任何有用的东西,而是为人类添加.但话说回来,人们会更好地去除周围多余的括号,我会说:a
int
a
auto
a
int(a);
Run Code Online (Sandbox Code Playgroud)
随着auto
使用C++ 0x到达的新含义,我不鼓励在代码中使用C++ 03的含义.