低レベルのプログラムを作成する必要があるため、C++を今学習しています。
「auto」キーワードについて学んだとき、C#の「var」キーワードを思い出させます。
それでは、C#「var」とC++「auto」の違いは何ですか?
C#では、varキーワードは関数内でローカルにのみ機能します。
var i = 10; // implicitly typed
C++の自動キーワード 推定可能 では、変数だけでなく、関数とテンプレートにも入力します。
auto i = 10;
auto foo() { //deduced to be int
return 5;
}
template<typename T, typename U>
auto add(T t, U u) {
return t + u;
}
パフォーマンスの観点から、 C++の自動キーワードはパフォーマンスに影響しません 。そして、varキーワード パフォーマンスにも影響しません 。
もう1つの違いは、IDEのインテリセンスサポートです。 C#のVarキーワードは簡単に推測でき、マウスオーバーでタイプが表示されます。 C++のautoキーワードでは、より複雑になる可能性があり、IDEに依存します。
簡単に言えば、auto
はvar
よりもはるかに複雑な獣です。
まず、auto
は推定型の一部にしかならないことがあります。例えば:
std::vector<X> xs;
// Fill xs
for (auto x : xs) x.modify(); // modifies the local copy of object contained in xs
for (auto& x : xs) x.modify(); // modifies the object contained in xs
for (auto const& x : xs) x.modify(); // Error: x is const ref
次に、auto
を使用して複数のオブジェクトを一度に宣言できます。
int f();
int* g();
auto i = f(), *pi = g();
第三に、auto
は、関数宣言の末尾の戻り型構文の一部として使用されます。
template <class T, class U>
auto add(T t, U u) -> decltype(t + u);
関数定義の型推論にも使用できます:
template <class T, class U>
auto add(T t, U u) { return t + u; }
第4に、将来、関数テンプレートの宣言に使用される可能性があります。
void f(auto (auto::*mf)(auto));
// Same as:
template<typename T, typename U, typename V> void f(T (U::*mf)(V));
それらは同等です。どちらも変数の型を自分で指定することはできませんが、変数は強く型付けされたままです。次の行は、c#では同等です。
var i = 10; // implicitly typed
int i = 10; //explicitly typed
また、次の行はc ++では同等です。
auto i = 10;
int i = 10;
ただし、c ++では、auto
変数の正しいタイプは、関数呼び出しのテンプレート引数推論のルールを使用して決定されることに注意してください。