我对以下代码感到困惑:
#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;在第一种情况下?
答案 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;)