2016-11-24 6 views
8

低レベルのプログラムを書く必要があるので、C++を学んでいます。C# "var"とC++ "auto"の違い

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

C# "var"とC++ "auto"の違いは何ですか?それらの機能を見るのと同じように見えます...

*まったく、わかりました!コメントしてくれてありがとう、皆に答えました!

*「メッセージを避ける」というメッセージが表示されたため、私のコメントは削除されました。

*私はたくさんの情報を持っています...ありがとうございました!

+0

彼らは本質的に同じであるため、両者はその後、型推論 – UnholySheep

+0

のために使用され、どちらも技術的には同じですか? –

+0

同じ効果を実現する2つのキーワード、つまり異なるプログラミング言語 – UnholySheep

答えて

11

C#のvarキーワードは、関数内でローカルでのみ動作しますで:変数ではなく、機能やテンプレートだけでなくC++ autoキーワードcan deduceタイプで

var i = 10; // implicitly typed 

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; 
} 

のパフォーマンスの観点から表示、auto keyword in C++ does not affect performance。 varキーワードdoes not affect performance as well

IDEのインテリセンスサポートにも違いがあります。 C#のVarキーワードは簡単に導き出すことができ、マウスで型を見ることができます。 C++でautoキーワードを使用すると、もっと複雑になることがあります。これはIDEに依存します。

+0

次に、autoはより広い範囲で使用できますか? –

+0

はい、C++でautoを使用すると、厳密な型チェックで連鎖全体を構築できます。 – qub1n

+0

'var'はC#でのパフォーマンスに影響しません。リンク先の例は壊れています。リスト bar1 = Foo();はコンパイル時エラーを生成します。 See [Servyのコメント](http://stackoverflow.com/questions/356846/will-using-var-affect-performance?rq=1#comment68562462_356855) –

6

これらは同等です。どちらも変数の型を自分で指定することはできませんが、変数は厳密に型指定されたままです。

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

そして、次の行では、C++で等価です::次の行は、C#で等価です

しかし
auto i = 10; 
int i = 10; 

、あなたが心に留めておくべきは、C++ auto変数の正しいタイプで関数呼び出しのテンプレート引数の控除の規則を使用して決定されます。

+1

プラス1つ。 C++の特定のインスタンスでは、lambda関数を使って作業しているときなど、 'auto'の使用はやむを得ないことに注意してください。 C#でもそうですか?また、 'auto i = 10;'には、C++ 11の前と後の意味が非常に異なっていることに注意してください。 – Bathsheba

+0

なぜやむを得ないのですか? 'auto' *は、コンパイル時に具体的な型またはジェネリック型に解決します。その具体的な型に置き換えることができます –

+0

そして、ラムダ関数の具体的な型は? – Bathsheba

4

簡単に言うと、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; } 

第四に、将来的には、関数テンプレートを宣言するために使用されることを始めることがあります。

void f(auto (auto::*mf)(auto)); 
// Same as: 
template<typename T, typename U, typename V> void f(T (U::*mf)(V));