web-dev-qa-db-ja.com

C#「var」とC ++「auto」の違い

低レベルのプログラムを作成する必要があるため、C++を今学習しています。

「auto」キーワードについて学んだとき、C#の「var」キーワードを思い出させます。

それでは、C#「var」とC++「auto」の違いは何ですか?

21
Kangjun Heo

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に依存します。

23
Tomas Kubes

簡単に言えば、autovarよりもはるかに複雑な獣です。

まず、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));
8
ach

それらは同等です。どちらも変数の型を自分で指定することはできませんが、変数は強く型付けされたままです。次の行は、c#では同等です。

var i = 10; // implicitly typed  
int i = 10; //explicitly typed  

また、次の行はc ++では同等です。

auto i = 10;
int i = 10;

ただし、c ++では、auto変数の正しいタイプは、関数呼び出しのテンプレート引数推論のルールを使用して決定されることに注意してください。

6
SingerOfTheFall