我对以下代码感到困惑:
#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 有一个更强大、更有趣的欣德利-米尔纳类型推理,它更"全局";这就是为什么我写"一些有限的种类")