Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于C+中自动关键字的混淆+;_C++_C++11_C++14_Auto_Storage Class Specifier - Fatal编程技术网

C++ 关于C+中自动关键字的混淆+;

C++ 关于C+中自动关键字的混淆+;,c++,c++11,c++14,auto,storage-class-specifier,C++,C++11,C++14,Auto,Storage Class Specifier,我被下面的代码弄糊涂了: #include <iostream> using namespace std; int *foo() { //Operation } int main () { auto int ret = foo(); } 但是,如果我删除inttype,如下所示: auto ret = foo(); 然后它成功运行 auto是一个存储类,int是一个数据类型,那么为什么在第一种情况下会出现“两个或更多数据类型”的错误?auto不是一个存储

我被下面的代码弄糊涂了:

#include <iostream>
using namespace std;

int *foo()
{
   //Operation
}

int main ()
{
        auto int ret = foo();
}
但是,如果我删除
int
type,如下所示:

auto ret = foo();
然后它成功运行


auto
是一个存储类
int
是一个数据类型,那么为什么在第一种情况下会出现“两个或更多数据类型”的错误?

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

因此,基本上执行自动int myVar字符串双myVar2bool long myVar3一样无效。。。变量只能有一种数据类型来定义它,在您的例子中,关键字auto会这样做

如何消除错误:

删除int类型,只需使用auto,这样做会让编译器自动推断变量**ret的类型正是
foo()
返回的类型:)非常友好

auto ret = foo();
从:

对于变量,指定正在处理的变量的类型 声明的将从其初始值设定项自动推断。对于 函数,指定返回类型为尾部返回类型或 将从其返回语句(从C++14开始)中推导。对于非类型 模板参数,指定将从 论据


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

auto int ret = foo();
auto ret = foo();
您基本上是将对象声明为具有两种类型(或者可能两次相同的类型),这是一个错误。当你说:

auto int ret = foo();
auto ret = foo();
ret
的类型由函数
foo
返回的值决定,在本例中为
int*

您写道:

auto
是一个存储类

但这在(或以后)中不再适用。
auto
关键字用于完全不同的内容(某些有限类型)。以前的C++03或C99
auto
存储类现在(在C++11中)总是隐式的,不应该使用
auto
关键字

(如果你喜欢类型推断,C++11做得不太好,但C++14或C++17已经在这方面取得了进展;Ocaml有一个更强大、更有趣、更“全局”的功能;这就是我写“某种有限类型”的原因)

auto
是一个存储类

在C++11之前,这一点曾经是正确的,但现在不是了

从C++11开始,这个词的意思已经改变了。它现在用于自动推断类型。看

为什么在第一种情况下,我得到一个错误“两个或更多的数据类型”

利用

auto int ret = foo();
您正在尝试为
ret
指定两种类型——一种是推导的,另一种是显式指定的

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

int ret = *foo(); // Since foo() returns a pointer.

或者,您可以让编译器使用以下命令推断类型:

auto ret = foo();  

你是过去的时间旅行者吗?我没有粗鲁,但我从未见过有人在野外使用
auto
作为存储类说明符。我想这就是为什么人们接受它可以被重新定位。不管怎样,现在(C++11上)它意味着
auto
自动推断类型,这太棒了。是的,他们同意更改它,因为他们从未在编译器一致性测试套件之外找到任何使用的证据。投票认为这是离题的人是错误的。这是一个合法的问题,但也是一个重复的问题。为什么要使用DOWNDOVERT?不是DOWNDOVERT,但我很好奇——简言之,OCaml的
auto
中缺少了什么?@BasileStarynkevitch我认为c++14(而不是c++11)也有函数(和lambda表达式)的类型推断,这听起来像是一句“c++是愚蠢的,我是礼仪吗?”的咆哮。与OCAML的比较,对于理解C++ <代码>自动>代码>或回答问题没有价值。@ NWP在对某些类型的有限类型推断的表达提出抱怨之后,编辑了OCAML比较以澄清。注意,
auto
在C中仍然是一个存储类,即使是在最新版本的标准中。它在C++中是无用的,但是C委员会倾向于更保守地处理保留词。