2016-04-28 4 views
9

Effective Modern C++ on page 167 (प्रिंट संस्करण का) स्कॉट मेयर की किताब में उन्होंने निम्न उदाहरण देता है:आमंत्रण अभिव्यक्ति में कॉल करने योग्य तर्क के लिए सही अग्रेषण का उद्देश्य?

auto timeFuncInvocation = [](auto&& func, auto&&... params) { 
    // start timer; 
    std::forward<decltype(func)>(func)(
    std::forward<decltype(params)>(params)... 
); 
    // stop timer and record elapsed time; 
}; 

मैं पूरी तरह से params का सही अग्रेषण समझते हैं, लेकिन यह मेरे लिए स्पष्ट नहीं है जब func का सही अग्रेषण कभी होगा प्रासंगिक। दूसरे शब्दों में, क्या निम्नलिखित से अधिक ऊपर के लाभ हैं:

auto timeFuncInvocation = [](auto&& func, auto&&... params) { 
    // start timer; 
    func(
    std::forward<decltype(params)>(params)... 
); 
    // stop timer and record elapsed time; 
}; 
+5

: इसलिए जब Func::operator() एक रेफरी से योग्य है जब 'func' में एक रिफ-क्वालिफाइड फ़ंक्शन कॉल ऑपरेटर होता है। –

+0

ओह्ह्ह्ह्ह .... सही समझ में आता है। –

उत्तर

11

तर्क के लिए के रूप में एक ही उद्देश्य के लिए:

struct Functor 
{ 
    void operator()() const & { std::cout << "lvalue functor\n"; } 
    void operator()() const && { std::cout << "rvalue functor\n"; } 
}; 

Demo

+4

'const' भाग को हटाएं, फिर यह * बेहतर * समझ में आता है। – Nawaz

+0

नहीं, क्योंकि 'const' rvalue संदर्भ' && 'अधिभार के लिए 'const &' अधिभार को प्राथमिकता देगा: 'const Functor f() {वापसी फ़ंक्शन {}; }; एफ()(); '[उदाहरण] (http://coliru.stacked-crooked.com/a/3e1b8f476f9e3f05) –

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