2014-04-25 9 views

Odpowiedz

12

Istnieje różnica, czy Function ma kryteria ref. Dzięki std::forward propagowana jest kategoria wartości argumentu, bez niej kategoria wartości zostaje utracona, a funkcja będzie zawsze wywoływana jako l-wartość. 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

Od kiedy można zastosować kwalifikatory ref do deklaracji funkcji członkowskich? – Deduplicator

+2

@Deduplicator: od 2011. –

+0

@Deduplicator: Od 'C++ 11'. Funkcjonalność jest opisana w [n2439] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm). Zobacz [tutaj] (http://en.cppreference.com/w/cpp/language/member_functions) i [tutaj] (http://stackoverflow.com/q/8610571/485561). – Mankarse

Powiązane problemy