24

我对以下代码感到困惑:

#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数据类型,那么为什么在第一种情况下会出现错误“两种或多种数据类型”?

4

4 回答 4

43

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

auto int ret = foo();

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

auto ret = foo();

的类型ret由函数foo返回的任何内容决定,int*在这种情况下就是这样。

于 2017-04-12T06:25:20.430 回答
33

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();  
于 2017-04-12T06:26:40.040 回答
10

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

所以基本上做auto int myVar与string double myVar2bool long myVar3一样无效......该变量只能有一种定义它的数据类型,在你的情况下,关键字 auto 就是这样做的......

如何摆脱错误:

删除int类型并只使用auto,这样做会让编译器*AUTO*** 自动推断变量 **ret 的类型正是从foo()返回的值中得出的 :) 真是太好了!

auto ret = foo();

来自文档

对于变量,指定要声明的变量的类型将自动从其初始化程序中推导出来。对于函数,指定返回类型是尾随返回类型或将从其返回语句中推导出来(C++14 起)。对于非类型模板参数,指定类型将从参数推导出

于 2017-04-12T06:23:23.950 回答
4

你写道:

auto是一个存储类

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

(如果你喜欢类型推断,C++11 做的不是很好,但是 C++14 或 C++17 在这方面有所进步;Ocaml 有一个更强大和有趣的 Hindley-Milner 类型推断,它更“全球”;这就是为什么我写了“一些有限的种类”)

于 2017-04-12T06:26:11.050 回答