2012-08-23 9 views
29

मैं यह समझ के रूप में, दोनों decltype और auto यह पता लगाने की क्या कुछ के प्रकार है का प्रयास करेंगे।decltype ऑटो बनाम

यदि हम परिभाषित:

int foo() { 
    return 34; 
} 

फिर दोनों घोषणाओं कानूनी हैं:

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

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

आप मुझे बता सकते क्या decltype और auto के बीच मुख्य अंतर है?

+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: ठीक है, अच्छी तरह से मैं स्कॉट द्वारा एक से एक बेहतर स्पष्टीकरण [पता नहीं है मेयर्स] (http: // सीपीपी-अगले।com/संग्रह/2011/04/प्रदर्शित होने और गायब-consts-इन-सी /)। –

उत्तर

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 के केवल एक या decltype संभव हो रहे हैं के बारे में डेविड Rodríguez के जवाब देखें।

29

auto (संदर्भ में, जहां यह एक प्रकार infers में) एक चर जिसके लिए वहाँ एक प्रारंभकर्ता है के प्रकार को परिभाषित करने तक सीमित है। 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 केवल एक नेता ताकि संकलक जानता है कि यह एक घोषणा है एक पीछे वापसी प्रकार के साथ। ऊपर के उदाहरण तुच्छता से पुरानी शैली में बदला जा सकता है, सामान्य प्रोग्रामिंग में यह उपयोगी है:

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

ध्यान दें कि इस मामले में, auto वापसी प्रकार परिभाषित करने के लिए इस्तेमाल नहीं किया जा सकता है।

0

आम तौर पर, यदि आप एक चर आप प्रारंभ करने जा रहे हैं के लिए एक प्रकार की जरूरत है, ऑटो का उपयोग करें। जब आप कुछ के लिए प्रकार है कि एक चर नहीं है, एक वापसी प्रकार की तरह की जरूरत है decltype बेहतर इस्तेमाल किया है।

संबंधित मुद्दे