जेनेरिक कोड में रिटर्न टाइप फॉरवर्ड करना
गैर-जेनेरिक कोड के लिए, आपके द्वारा दिए गए प्रारंभिक उदाहरण की तरह, आप रिटर्न प्रकार के रूप में संदर्भ प्राप्त करने के लिए मैन्युअल रूप से चयन कर सकते हैं:
auto const& Example(int const& i)
{
return i;
}
लेकिन में सामान्य कोड आप के लिए सक्षम होना चाहते हैं पूरी तरह से एक वापसी प्रकार आगे जानने के लिए कि क्या आप एक संदर्भ या एक मूल्य के साथ काम कर रहे बिना। decltype(auto)
आपको वह क्षमता प्रदान करता है:
template<class Fun, class... Args>
decltype(auto) Example(Fun fun, Args&&... args)
{
return fun(std::forward<Args>(args)...);
}
पुनरावर्ती टेम्प्लेट में वापसी प्रकार की कटौती में देरी
में इस क्यू एंड ए कुछ दिन पहले, टेम्पलेट इन्स्टेन्शियशन दौरान एक अनंत प्रत्यावर्तन जब टेम्पलेट की वापसी प्रकार के रूप में निर्दिष्ट किया गया था का सामना करना पड़ा था decltype(iter(Int<i-1>{}))
बजाय decltype(auto)
।
template<int i>
struct Int {};
constexpr auto iter(Int<0>) -> Int<0>;
template<int i>
constexpr auto iter(Int<i>) -> decltype(auto)
{ return iter(Int<i-1>{}); }
int main() { decltype(iter(Int<10>{})) a; }
decltype(auto)
टेम्पलेट तात्कालिकता की धूल के निपटारे के बाद वापसी प्रकार की कटौती में देरी के लिए यहां उपयोग किया जाता है ।
अन्य उपयोग
आप decltype(auto)
अन्य संदर्भों में भी उपयोग कर सकते हैं , उदाहरण के लिए मानक N3936 का मसौदा भी बताता है
7.1.6.4 ऑटो स्पेक [एर [dcl.spec.auto]
1: auto
और decltype(auto)
टाइप-स्पीशी design र्स एक प्लेसहोल्डर प्रकार को नामित करता है जिसे बाद में बदल दिया जाएगा, या तो एक इनिशलाइज़र से कटौती करके या एक स्पष्ट रिटर्न-प्रकार के साथ स्पष्ट स्पेनी with कटेशन द्वारा। auto
टाइप-विशिष्ट एर भी दर्शाता है कि एक लैम्ब्डा एक सामान्य लैम्ब्डा है प्रयोग किया जाता है।
2 प्लेसहोल्डर प्रकार किसी भी संदर्भ में, जहां इस तरह के एक घोषणाकर्ता मान्य है, डिक्लेयर -सीक, टाइप-स्पेसियर-सेक, कनवर्ज़न-फंक्शन-आईडी या ट्रेलिंग-रिटर्न-टाइप में एक फ़ंक्शन घोषणाकर्ता के साथ दिखाई दे सकता है । यदि फ़ंक्शन घोषणाकर्ता में एक ट्रेलिंग-रिटर्न-टाइप (8.3.5) शामिल है, जो फ़ंक्शन के घोषित रिटर्न प्रकार को निर्दिष्ट करता है। यदि फ़ंक्शन के घोषित रिटर्न प्रकार में एक प्लेसहोल्डर प्रकार होता है, तो फ़ंक्शन का रिटर्न प्रकार फ़ंक्शन के शरीर में रिटर्न स्टेटमेंट से कट जाता है, यदि कोई हो।
ड्राफ्ट में वैरिएबल इनिशियलाइज़ेशन का यह उदाहरण भी शामिल है:
int i;
int&& f();
auto x3a = i; // decltype(x3a) is int
decltype(auto) x3d = i; // decltype(x3d) is int
auto x4a = (i); // decltype(x4a) is int
decltype(auto) x4d = (i); // decltype(x4d) is int&
auto x5a = f(); // decltype(x5a) is int
decltype(auto) x5d = f(); // decltype(x5d) is int&&
auto x6a = { 1, 2 }; // decltype(x6a) is std::initializer_list<int>
decltype(auto) x6d = { 1, 2 }; // error, { 1, 2 } is not an expression
auto *x7a = &i; // decltype(x7a) is int*
decltype(auto)*x7d = &i; // error, declared type is not plain decltype(auto)