2016-04-28 23 views
9

Nel libro di Scott Meyer Effective Modern C++ on page 167 (della versione di stampa), ha pronunciato la seguente esempio:Scopo dell'inoltro perfetto per l'argomento Callable nell'espressione di invocazione?

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

Capisco completamente la perfetta inoltro di params, ma non è chiaro per me quando l'inoltro perfetto di func sarebbe mai pertinente. In altre parole, quali sono i vantaggi di cui sopra il seguente:

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

Quando 'func' ha un operatore di chiamata della funzione qualificata ref-ref. –

+0

Ohhhhhh .... ha perfettamente senso. –

risposta

11

Per lo stesso scopo come per argomenti: così quando Func::operator() è un ref-qualificato:

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

Demo

+4

Rimuove la parte 'const', quindi rende * migliore * il senso. – Nawaz

+0

no, dato che il riferimento a 'const' rvalue preferirà' const & 'overload a' && 'overload:' const Functor f() {return Functor {}; }; f()(); '[esempio] (http://coliru.stacked-crooked.com/a/3e1b8f476f9e3f05) –