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与字符串双myVar2或bool 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或C99auto
存储类现在(在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委员会倾向于更保守地处理保留词。