关于C++中auto关键字的困惑

msc*_*msc 24 c++ storage-class-specifier auto c++11 c++14

我对以下代码感到困惑:

#include <iostream>
using namespace std;

int *foo()
{
   //Operation
}

int main ()
{
        auto int ret = foo();
}
Run Code Online (Sandbox Code Playgroud)

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

error: two or more data types in declaration of 'ret'
         auto int ret = foo();
Run Code Online (Sandbox Code Playgroud)

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

auto ret = foo();
Run Code Online (Sandbox Code Playgroud)

然后它成功运行.

auto是一个存储类,int是一种数据类型,那么为什么我在第一种情况下得到"两种或更多数据类型"的错误?

Ben*_*ley 43

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

auto int ret = foo();
Run Code Online (Sandbox Code Playgroud)

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

auto ret = foo();
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,即使在最新版本的标准中,`auto`仍然是C中的存储类.它和C++一样无用,但是C委员会对保守字的混淆更加保守. (2认同)

R S*_*ahu 32

auto 是一个存储类

在C++ 11之前曾经如此,但现在已经没有了.

从C++ 11开始,单词的含义已经改变.它现在用于自动推断类型.见http://www.stroustrup.com/C++11FAQ.html#auto.

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

通过使用

auto int ret = foo();
Run Code Online (Sandbox Code Playgroud)

您正在尝试指定两种类型ret- 一种是推导的,另一种是明确指定的.

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

int ret = *foo(); // Since foo() returns a pointer.
Run Code Online (Sandbox Code Playgroud)

要么

int* ret = foo();
Run Code Online (Sandbox Code Playgroud)

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

auto ret = foo();  
Run Code Online (Sandbox Code Playgroud)


ΦXo*_*a ツ 10

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

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

如何摆脱错误:

删除int类型并且只使用auto,这样做会让编译器*AUTO***从根本上推断出变量的类型**ret正是从foo()返回的那个:)只是和蔼!

auto ret = foo();
Run Code Online (Sandbox Code Playgroud)

来自文档:

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