msc*_*msc 24 c++ storage-class-specifier auto c++11 c++14
我对以下代码感到困惑:
#include <iostream>
using namespace std;
int *foo()
{
//Operation
}
int main ()
{
auto int ret = foo();
}
Run Code Online (Sandbox Code Playgroud)
我在GCC下编译了上面的代码,但是我收到了以下错误:
error: two or more data types in declaration of 'ret'
auto int ret = foo();
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除int类型,如下:
auto ret = foo();
Run Code Online (Sandbox Code Playgroud)
然后它成功运行.
auto是一个存储类,int是一种数据类型,那么为什么我在第一种情况下得到"两种或更多数据类型"的错误?
Ben*_*ley 43
auto不是存储类.它曾经是,在C++ 11之前.但它完全没用,所以关键字被重新用于允许自动类型推断.所以当你说:
auto int ret = foo();
Run Code Online (Sandbox Code Playgroud)
您基本上声明对象有两种类型(或可能是两次相同的类型),这是一个错误.当你说:
auto ret = foo();
Run Code Online (Sandbox Code Playgroud)
类型ret由函数foo返回的任何函数确定,int*在这种情况下.
R S*_*ahu 32
auto是一个存储类
在C++ 11之前曾经如此,但现在已经没有了.
从C++ 11开始,单词的含义已经改变.它现在用于自动推断类型.见http://www.stroustrup.com/C++11FAQ.html#auto.
为什么在第一种情况下我收到"两种或更多数据类型"的错误?
通过使用
auto int ret = foo();
Run Code Online (Sandbox Code Playgroud)
您正在尝试指定两种类型ret- 一种是推导的,另一种是明确指定的.
如果要使用显式指定的类型,可以使用:
int ret = *foo(); // Since foo() returns a pointer.
Run Code Online (Sandbox Code Playgroud)
要么
int* ret = foo();
Run Code Online (Sandbox Code Playgroud)
或者你可以让编译器使用以下方法推断出类型:
auto ret = foo();
Run Code Online (Sandbox Code Playgroud)
ΦXo*_*a ツ 10
auto不是存储类(自C++ 11以来不再存在)C++ 11带来了关键字,允许编译器推断出您声明的变量所需的类型.
所以基本上做auto int myVar和string double myVar2或bool long myVar3一样无效......变量只能有一种定义它的数据类型,在你的情况下,关键字auto 会这样做 ......
如何摆脱错误:
删除int类型并且只使用auto,这样做会让编译器*AUTO***从根本上推断出变量的类型**ret正是从foo()返回的那个:)只是和蔼!
auto ret = foo();
Run Code Online (Sandbox Code Playgroud)
来自文档:
对于变量,指定将从其初始化程序自动推导出正在声明的变量的类型.对于函数,指定返回类型是尾随返回类型,或者将从其返回语句推断出(自C++ 14以来).对于非类型模板参数,指定将从参数推导出类型
| 归档时间: |
|
| 查看次数: |
3836 次 |
| 最近记录: |