【问题标题】:Confusion about auto keyword in C++ [duplicate]关于C ++中auto关键字的困惑[重复]
【发布时间】:2017-09-07 18:40:13
【问题描述】:

我对以下代码感到困惑:

#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数据类型,那么为什么会出现“两种或多种数据类型”错误在第一种情况下?

【问题讨论】:

  • 你是过去的时间旅行者吗?
  • 我没有粗鲁,但我从未见过有人在野外使用auto 作为存储类说明符。我认为这就是为什么人们接受它可以被重新利用的原因。不管怎样,现在(C++11 上)这意味着 automatically 推断类型,这太棒了。
  • 是的,他们同意更改它,因为他们从未在编译器一致性测试套件之外找到单一用途的证据。
  • 投票为题外话的人是错误的。这是一个合法的问题,但重复

标签: c++ c++11 c++14 auto storage-class-specifier


【解决方案1】:

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

auto int ret = foo();

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

auto ret = foo();

ret 的类型取决于函数 foo 返回的任何内容,在本例中为 int*

【讨论】:

  • 请注意,auto 仍然是 C 中的存储类,即使在标准的最新版本中也是如此。它在那里和在 C++ 中一样没用,但 C 委员会在弄乱保留字方面往往更加更加保守。
【解决方案2】:

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();  

【讨论】:

    【解决方案3】:

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

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

    如何摆脱错误:

    去掉int类型,只使用auto,这样做会让编译器*AUTO***自动推断变量的类型** ret 正是 foo() 返回的内容 :) 很亲切!

    auto ret = foo();
    

    来自doc

    对于变量,指定要处理的变量的类型 声明将自动从其初始化程序中推导出来。为了 函数,指定返回类型是尾随返回类型或 将从它的返回语句中推导出来(C++14 起)。对于非类型 模板参数,指定类型将从 论据

    【讨论】:

      【解决方案4】:

      你写道:

      auto 是一个存储类

      但这在C++11(或更高版本)中不再适用。 auto 关键字一直是 reused 用于完全不同的东西(某种有限的type inference)。以前的 C++03 或 C99 auto 存储类现在(在 C++11 中)始终是隐式的,并且应该使用 auto 关键字。

      (如果你喜欢类型推断,C++11 做的不是很好,但是 C++14 或 C++17 在这方面有所进步;Ocaml 有一个更强大更有趣的Hindley-Milner type inference哪个更“全球”;这就是为什么我写了“一些有限的种类”)

      【讨论】:

      • 为什么投反对票?
      • 不是反对者,但我很好奇 - 简而言之,OCaml 的 auto 缺少什么?
      • @BasileStarynkevitch 我认为 c++14(但不是 c++11)对函数(和 lambda 表达式)也有类型推断,请参阅 en.cppreference.com/w/cpp/language/auto
      • 这读起来就像“C++ 是愚蠢的,我是不是有礼貌?”咆哮。与 Ocaml 的比较对于理解 C++ auto 的功能或回答问题没有任何价值。
      • @nwp 在有人抱怨“某种有限类型的类型推断”这一表达并将其混淆为无知之后,为了澄清而编辑了 Ocaml 比较。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2017-11-08
      相关资源
      最近更新 更多