2012-08-23 11 views
29

私が理解しているように、decltypeautoは、何かの型が何であるかを理解しようとします。decltype vs auto

我々が定義する場合:

int foo() { 
    return 34; 
} 

を次に両方の宣言は有効です:

auto x = foo(); 
cout << x << endl; 

decltype(foo()) y = 13; 
cout << y << endl; 

あなたはdecltypeautoの主な違いは何であるかを教えていただけますか?

+1

@JesseGood質問をする前に、そのスレッドを読んで、クリーナーの説明を探しています –

+1

同様の質問: [1]:http://stackoverflow.com/questions/11459928/equivalence-between-decltype-and-自動 [2]:http://stackoverflow.com/questions/6869888/the-relationship-between-auto-and-decltype – crnlx

+1

@JamesLeonard:さて、よくわかりませんが、[Scott Meyers](http:// cpp-next。co.jp/archive/2011/04/appearing-and-disappearing-consts-in-c /)を参照してください。 –

答えて

25

decltypeは、の型に渡されます。 autoは、テンプレートタイプの控除と同じことを行います。たとえば、参照を返す関数がある場合は、autoはまだ値(参照を取得するにはauto&が必要です)ですが、decltypeは戻り値の型に正確になります。

#include <iostream> 
int global{}; 
int& foo() 
{ 
    return global; 
} 

int main() 
{ 
    decltype(foo()) a = foo(); //a is an `int&` 
    auto b = foo(); //b is an `int` 
    b = 2; 

    std::cout << "a: " << a << '\n'; //prints "a: 0" 
    std::cout << "b: " << b << '\n'; //prints "b: 2" 

    std::cout << "---\n"; 
    decltype(foo()) c = foo(); //c is an `int&` 
    c = 10; 

    std::cout << "a: " << a << '\n'; //prints "a: 10" 
    std::cout << "b: " << b << '\n'; //prints "b: 2" 
    std::cout << "c: " << c << '\n'; //prints "c: 10" 
} 

はまただけautoの1またはdecltypeが可能である、場所についてデビッド・ロドリゲスの回答を参照してください。

29

auto(型を推定するコンテキストで)は、初期化子がある変数の型を定義することに限定されます。 decltypeは、余分な情報を犠牲にして、式のタイプを推測する、より広範な構成です。

autoを使用できる場合は、タイプが推定される式を指定する必要がないため、decltypeより簡潔です。

auto x = foo();       // more concise than `decltype(foo()) x` 
std::vector<decltype(foo())> v{ foo() }; // cannot use `auto` 

autoも完全に無関係な文脈で使用されているキーワードは、関数の戻り値の型を末尾に使用している場合:コンパイラは、この宣言があることを知っているようにあり

auto foo() -> int; 

autoのみリーダーであります末尾の戻り値の型を持ちます。上記の例は自明古いスタイルに変換することができますが、一般的なプログラミングでは有用です。この場合には、autoは、戻り値の型を定義するために使用することはできません

template <typename T, typename U> 
auto sum(T t, U u) -> decltype(t+u) 

注こと。あなたは、変数の型が必要な場合は一般的に、あなたが初期化しようとしている

0

自動を使用しています。 decltypeは、戻り値の型のような、変数ではない型に型を必要とするときによく使用されます。

関連する問題