关于C ++中auto关键字的困惑

时间:2017-04-12 06:22:22

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

我对以下代码感到困惑:

#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数据类型,然后为什么我会收到错误&#34 ;两种或更多数据类型&#34;在第一种情况下?

4 个答案:

答案 0 :(得分:43)

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

auto int ret = foo();

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

auto ret = foo();

ret的类型取决于foo返回的函数,在这种情况下为int*

答案 1 :(得分:32)

  

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

答案 2 :(得分:10)

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

所以基本上 auto int myVar string double myVar2 bool long myVar3 一样无效......变量只能有一个定义它的数据类型,在您的情况下,关键字auto会执行该操作...

如何摆脱错误:

删除 int 类型并只使用 auto ,这样做会让编译器 * AUTO ***推断出该类型的变量** ret 正是来自foo()返回:)只是和蔼!

auto ret = foo();

来自doc

  

对于变量,指定正在变量的类型   声明将从其初始化程序中自动推断出来。对于   functions,指定返回类型是尾随返回类型或   将从其返回语句中推断出(自C ++ 14以来)。对于非类型   模板参数,指定将从中推导出的类型   参数

答案 3 :(得分:4)

你写道:

  

<?php echo "<table>"; echo "<thead>"; echo "<tr><th>Chemical One</th><th>Chemical two</th></tr>"; echo "</thead>"; echo "<tbody>"; $chemical=array('c1','c2','c3','c4'); $count_chem=count($chemical); for ($i=0; $i <= $count_chem; $i++) { for ($j=$i+1; $j < $count_chem; $j++) { echo "<tr>"; echo "<td>".$chemical[$i]."</td>"; echo "<td>".$chemical[$j]."</td>"; echo "<tr>"; } } echo "</tbody></table>"; ?> 是一个存储类

但在C++11(或更晚)中不再如此。 auto关键字已经reused用于完全不同的内容(某些有限类型的type inference)。以前的C ++ 03或C99 auto存储类现在(在C ++ 11中)始终是隐式的,并且使用auto关键字。

(如果你喜欢类型推断,C ++ 11的表现不是很好,但是C ++ 14或C ++ 17已经取得了进展; Ocaml有一个更强大和有趣的{{3更多&#34; global&#34 ;;这就是为什么我写了#34;某些有限种类&#34;)