2015-02-16 9 views
18

मैं समझने की कोशिश कर रहा हूं कि std::declval<T>() कैसे काम करता है। मैं इसे कैसे उपयोग करने के लिए, और पता है कि वह क्या करता पता है, मुख्य रूप से आप वस्तु के निर्माण के बिना decltype उपयोग करने के लिए, की तरहstd :: declval <T>() काम कैसे करता है?

decltype(std::declval<Foo>().some_func()) my_type; // no construction of Foo 

मैं cppreference.com कि std::declval<Foo> से पता की अनुमति देता है "कहते हैं," Foo करने के लिए एक rvalue संदर्भ, जिसकी वजह से संदर्भ ढहने के नियम या तो एक रावल्यू संदर्भ या एक लालू संदर्भ होने के समाप्त होता है। मेरा सवाल यह है कि Foo के निर्माता को क्यों नहीं कहा जाता है? टेम्पलेट पैरामीटर के निर्माण के बिना std::declval<T> का "खिलौना" संस्करण कैसे कार्यान्वित कर सकता है?

पुनश्च: I know यह पुरानी चाल के रूप में ही

(*(T*)(nullptr)) 
+0

उसी पृष्ठ से: "ध्यान दें कि क्योंकि अस्वीकृति के लिए कोई परिभाषा मौजूद नहीं है, इसका उपयोग केवल अनियमित संदर्भों में किया जा सकता है; यह एक अभिव्यक्ति का मूल्यांकन करने में त्रुटि है जिसमें यह फ़ंक्शन शामिल है।" –

+0

@remyabel हां, मैंने देखा कि, मुझे नहीं पता कि कैसे अपना खुद का 'घोषणा' – vsoftco

+0

'टेम्पलेट < class T > टाइपनाम std :: add_rvalue_reference :: प्रकार अस्वीकरण(); 'सचमुच आपको केवल इतना ही चाहिए। [लाइव उदाहरण] (http://coliru.stacked-crooked.com/a/9a8d4e5cfa60355f) –

उत्तर

12

मूल रूप से, एक sizeof या decltype अभिव्यक्ति आप कार्यों कि कहीं भी लागू नहीं किया जाता है (वे की घोषणा की ज़रूरत कॉल कर सकते हैं में नहीं है, लागू नहीं किया)।

उदा।

class Silly { private: Silly(Silly const&) = delete; }; 

auto foo() -> Silly&&; 

auto main() -> int 
{ 
    sizeof(foo()); 
} 

लिंकर को इसके बारे में शिकायत नहीं करनी चाहिए।

+0

आह, ठीक है, अब यह समझ में आता है कि "एक रावल्यू संदर्भ जोड़ना" चाल क्यों करता है। किसी कारण से मुझे नहीं पता था कि आप घोषित कार्यों पर 'decltype' का उपयोग कर सकते हैं। एकमात्र चीज जो मैं अभी भी थोड़ा परेशान हूं, आप '.f()' को 'declal () .f() 'में क्यों कॉल कर सकते हैं, मैंने सोचा होगा कि आपको' declval () :: f () ' – vsoftco

+2

@vsoft एक अव्यवस्थित संदर्भ में, सभी महत्वपूर्ण हैं प्रकार हैं। उदाहरण का उपयोग करने के लिए आपको उदाहरण की आवश्यकता नहीं है: आपको केवल नाटक करने की आवश्यकता है। दो ट्रॉली ट्रैक होने पर, आखिरकार जंगल में गिरने की आवाज क्या है? – Yakk

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