2014-04-25 12 views

risposta

12

C'è una differenza se lo operator() di ha qualificazioni di riferimento. Con std::forward, la categoria di valore dell'argomento viene propagata, senza di essa, la categoria di valore viene persa e la funzione verrà sempre chiamata come valore l. Live Example.

#include <iostream> 

struct Fun { 
    void operator()() & { 
     std::cout << "L-Value\n"; 
    } 
    void operator()() && { 
     std::cout << "R-Value\n"; 
    } 
}; 

template <class Function> 
void apply(Function&& function) { 
    function(); 
} 

template <class Function> 
void apply_forward(Function&& function) { 
    std::forward<Function>(function)(); 
} 

int main() { 
    apply(Fun{});   // Prints "L-Value\n" 
    apply_forward(Fun{}); // Prints "R-Value\n" 
} 
+0

Da quando è possibile applicare i qualificatori di riferimento alle dichiarazioni di funzioni membro? – Deduplicator

+2

@Deduplicator: dal 2011. –

+0

@Deduplicator: Poiché 'C++ 11'. La funzionalità è descritta in [n2439] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm). Vedi [qui] (http://en.cppreference.com/w/cpp/language/member_functions) e [qui] (http://stackoverflow.com/q/8610571/485561). – Mankarse