C++中对自动关键字的混淆

Confusion about auto keyword in C++

本文关键字:关键字 C++      更新时间:2023-10-16

我对以下代码感到困惑:

#include <iostream>
using namespace std;
int *foo()
{
//Operation
}
int main ()
{
auto int ret = foo();
}

我在GCC下编译了上面的代码,但是出现以下错误:

error: two or more data types in declaration of 'ret'
auto int ret = foo();

但是,如果我删除int类型,如下所示:

auto ret = foo();

然后它成功运行。

auto存储类int数据类型,那么为什么在第一种情况下会出现错误"两种或多种数据类型"?

auto不是存储类。过去是,在C++11之前。但它完全没用,因此关键字被重新用于允许自动类型推断。所以当你说:

auto int ret = foo();

您基本上将对象声明为具有 2 种类型(或可能两次相同的类型),这是一个错误。当你说:

auto ret = foo();

ret的类型由foo返回的函数确定,在这种情况下int*

auto是一个存储类

在C++11之前曾经如此,但现在不再如此。

从C++11开始,这个词的含义发生了变化。它现在用于自动推断类型。请参阅 http://www.stroustrup.com/C++11FAQ.html#auto。

为什么在第一种情况下我收到错误"两种或多种数据类型"?

通过使用

auto int ret = foo();

您正在尝试为ret指定两种类型 - 一种是推导的,另一种是显式指定的。

如果要使用显式指定的类型,可以使用:

int ret = *foo(); // Since foo() returns a pointer.

int* ret = foo();

或者,您可以让编译器使用以下方法推断类型:

auto ret = foo();  

auto 不是存储类(自 C++11 以来不再如此) C++11 带来了关键字,允许编译器推断您声明的变量所需的类型。

所以基本上做自动 int myVar就像字符串双 myVar2布尔长 myVar3一样无效......变量只能有一种数据类型来定义它,在您的情况下,关键字 auto 可以做到这一点......

如何摆脱错误:

删除int类型并只使用auto,这样做会让编译器 *AUTO*** 以方式推断变量 **ret 的类型正是从foo()返回的内容中推断出:)只是和蔼可亲!

auto ret = foo();

从文档中:

对于变量,指定正在 声明将从其初始值设定项自动推导。为 函数,指定返回类型是尾随返回类型或 将从其返回语句中推断出来(自 C++14 起)。对于非类型 模板参数,指定将从 论点

你写道:

auto是一个存储类

但在 C++11(或更高版本)中不再如此。auto关键字已被重用于完全不同的内容(某种有限的类型推断)。以前的 C++03 或 C99auto存储类现在(在 C++11 中)始终是隐式的,不应使用auto关键字。

(如果你喜欢类型推断,C++11 做得不是很好,但 C++14 或 C++17 在这方面取得了进展;Ocaml 有一个更强大、更有趣的欣德利-米尔纳类型推理,它更"全局";这就是为什么我写"一些有限的种类")