次のコードに戸惑っています。
#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
はデータタイプであり、なぜ「2または最初のケースでより多くのデータ型」
auto
はストレージクラスではありません。それはC++ 11より前のバージョンでした。しかし、それは完全に役に立たなかったので、キーワードは自動型推論を可能にするために再利用されました。だからあなたが言うとき:
auto int ret = foo();
あなたは基本的にオブジェクトを2つのタイプ(またはおそらく2回同じタイプ)を持つように宣言しています、そしてそれはエラーです。そしてあなたが言うとき:
auto ret = foo();
ret
のタイプは、関数foo
が返すもの、つまりint*
この場合。
auto
はストレージクラスです
これは、C++ 11より前は真実でしたが、現在はそうではありません。
C++ 11以降、Wordの意味が変更されました。自動的に型を推定するために使用されます。 http://www.stroustrup.com/C++11FAQ.html#auto を参照してください。
最初のケースで「2つ以上のデータ型」のエラーが発生するのはなぜですか?
を使用して
auto int ret = foo();
ret
に2つのタイプを指定しようとしています。1つは演繹され、もう1つは明示的に指定されています。
明示的に指定されたタイプを使用したい場合は、以下を使用できます。
int ret = *foo(); // Since foo() returns a pointer.
または
int* ret = foo();
または、次のコマンドを使用して、コンパイラにタイプを推定させることができます。
auto ret = foo();
autoはストレージクラスではありません(C++ 11以降ではありません)C++ 11は、宣言する変数に必要な型をコンパイラが推測できるようにするキーワードを提供します。
基本的にauto int myVarを行うことはstring double myVar2またはbool long myVar3...変数はそれを定義する1つのデータ型のみを持つことができ、あなたの場合キーワードautoはそれを行います...
エラーを取り除く方法:
intタイプを削除し、autoを使用するだけで、 * AUTO ***へのコンパイラは、変数の型** retがfoo()
が返すものから正確にそれを推測する:)ちょうどいい!
auto ret = foo();
doc から:
変数の場合、宣言されている変数の型がその初期化子から自動的に推定されることを指定します。関数の場合、戻り値の型が末尾の戻り値の型であるか、またはその戻りステートメントから推定されることを指定します(C++ 14以降)。非タイプテンプレートパラメータの場合、タイプが引数から推定されることを指定します
あなたはそれを書きました:
auto
はストレージクラスです
しかし、これは C++ 11 以降では当てはまりません。 auto
キーワードは、完全に異なるものに対して 再利用 になりました(一部の限られた種類の 型推論 )。以前のC++ 03またはC99 auto
ストレージクラスは(C++ 11では)常に暗黙的であり、notを使用する必要がありますauto
キーワード。
(型推論が好きな場合、C++ 11はうまく機能していませんが、C++ 14またはC++ 17はその上で進歩しています。Ocamlには、はるかに強力で興味深い Hindley-Milner型推論があります。 これはより「グローバル」です;それが私が「いくつかの限定された種類」を書いた理由です)