首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中auto关键字的混淆

C++中auto关键字的混淆
EN

Stack Overflow用户
提问于 2017-04-12 06:22:22
回答 3查看 4.6K关注 0票数 24

下面的代码使我感到困惑:

代码语言:javascript
复制
#include <iostream>
using namespace std;

int *foo()
{
   //Operation
}

int main ()
{
        auto int ret = foo();
}

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

代码语言:javascript
复制
error: two or more data types in declaration of 'ret'
         auto int ret = foo();

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

代码语言:javascript
复制
auto ret = foo();

然后它就成功运行了。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-12 06:25:20

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

代码语言:javascript
复制
auto int ret = foo();

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

代码语言:javascript
复制
auto ret = foo();

ret的类型由foo返回的任何函数决定,在本例中是int*

票数 43
EN

Stack Overflow用户

发布于 2017-04-12 06:26:40

auto是一个存储类

这在C++11之前是正确的,但现在不再是这样了。

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

为什么在第一次我得到一个错误“两个或更多的数据类型”?

通过使用

代码语言:javascript
复制
auto int ret = foo();

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

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

代码语言:javascript
复制
int ret = *foo(); // Since foo() returns a pointer.

代码语言:javascript
复制
int* ret = foo();

或者,可以让编译器通过以下方法推断类型:

代码语言:javascript
复制
auto ret = foo();  
票数 33
EN

Stack Overflow用户

发布于 2017-04-12 06:23:23

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

因此,从根本上说,执行auto 字符串双myVar2bool long myVar3一样无效。变量只能有一种数据类型定义它,在您的情况下关键字auto可以这样做.

如何消除错误:

删除int类型,只使用auto,这样做将使编译器可以通过*AUTO*以方式推断变量**ret的类型正是foo()返回的内容:)只是友好的!

代码语言:javascript
复制
auto ret = foo();

来自文档

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43361805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档