下面的代码使我感到困惑:
#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是数据类型,那么为什么在第一种情况下得到错误“两个或多个数据类型”?
发布于 2017-04-12 06:25:20
auto不是存储类。它曾经是,在C++11之前,但它是完全无用的,所以关键字被重新使用,以允许自动类型推断。所以当你说:
auto int ret = foo();您基本上是将对象声明为有两个类型(或者可能是同一类型两次),这是一个错误。当你说:
auto ret = foo();ret的类型由foo返回的任何函数决定,在本例中是int*。
发布于 2017-04-12 06:26:40
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-12 06:23:23
auto不再是一个存储类(自C++11以来不再是),C++11引入了关键字,允许编译器推断您声明的变量所需的类型。
因此,从根本上说,执行auto 与字符串双myVar2或bool long myVar3一样无效。变量只能有一种数据类型定义它,在您的情况下关键字auto可以这样做.
如何消除错误:
删除int类型,只使用auto,这样做将使编译器可以通过*AUTO*以方式推断变量**ret的类型正是foo()返回的内容:)只是友好的!
auto ret = foo();来自文档
对于变量,指定要声明的变量的类型将自动从其初始化器中推断出来。对于函数,指定返回类型是尾随返回类型,或者将从其返回语句(自C++14)中推断。对于非类型模板参数,指定将从参数中推断该类型。
https://stackoverflow.com/questions/43361805
复制相似问题