2012-08-23 8 views
29

Wie ich es verstehe, werden sowohl decltype und auto versuchen, herauszufinden, was der Typ von etwas ist.decltype vs auto

Wenn wir definieren:

int foo() { 
    return 34; 
} 

Dann werden beide Erklärungen sind legal:

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

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

Könnten Sie mir bitte sagen, was der größte Unterschied zwischen decltype und auto ist?

+1

@JesseGood Bevor ich die Frage stelle, lese ich diesen Thread und bin auf der Suche nach einer saubereren Erklärung –

+1

Ähnliche Fragen: [1]: http://stackoverflow.com/questions/11459928/equivalence-between-decltype-and- auto [2]: http://stackoverflow.com/questions/6869888/the-relationship-between-auto-and-declype – crnlx

+1

@ JamesLeonard: Okay, nun, ich kenne keine bessere Erklärung [als die von Scott Meyers] (http: // cpp-next.com/archive/2011/04/erscheinen-und-verschwinden-costs-in-c /). –

Antwort

25

decltype gibt den deklarierten Typ des Ausdrucks, der an es übergeben wird. auto macht das gleiche wie Vorlage Abzug. Wenn Sie zum Beispiel eine Funktion haben, die eine Referenz zurückgibt, ist immer noch ein Wert (Sie benötigen auto&, um eine Referenz zu erhalten), aber decltype ist genau der Typ des Rückgabewerts.

#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" 
} 

Auch David Rodríguez Antwort über die Orte, in denen nur eine von auto oder decltype möglich sehen.

29

auto (in dem Kontext, in dem es einen Typ ableitet) beschränkt auf den Typ einer Variablen, für die es einen Initialisierer gibt. decltype ist ein breiteres Konstrukt, das auf Kosten zusätzlicher Informationen auf den Typ eines Ausdrucks schließen lässt.

In den Fällen, in denen auto verwendet werden kann, ist es prägnanter als decltype, da Sie nicht den Ausdruck angeben müssen, aus dem der Typ abgeleitet wird.

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

Das Schlüsselwort auto auch in einem völlig anderen Kontext verwendet wird, wenn für Funktionen Rückgabetypen Hinter mit:

auto foo() -> int; 

Es auto ist nur ein Führer, so dass der Compiler weiß, dass dies eine Erklärung mit einem abschließenden Rückgabetyp. Während das obige Beispiel kann trivialerweise in der generischen Programmierung alten Stil, umgewandelt werden ist es sinnvoll:

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

Beachten Sie, dass in diesem Fall auto nicht den Rückgabetyp zu definieren, verwendet werden kann.

0

Im Allgemeinen, wenn Sie einen Typ für eine Variable müssen Sie initialisieren wollen, verwenden Sie Auto. declltype wird besser verwendet, wenn Sie den Typ für etwas benötigen, das keine Variable ist, wie ein Rückgabetyp.

Verwandte Themen