2015-04-15 4 views
1

Я выполняю функции кодирования, как хорошо известно tuple_apply, которые принимают значение rvalue функции как параметра. Во время моих исследований в Интернете, я наткнулся на два следующих вызовов:Утилита std: forward <Func> по вызову

template < 
    typename Func, 
    /* stuff */ 
> 
void myfunction(Func && func, /* stuff */) 
{ 
    std::forward<Func>(func)(/* stuff */); // use of std::forward before call 
    func(/* stuff */);      // direct call 
} 

Является ли этот призыв к std::forward действительно ПОЛЕЗНЫЙ? Если да, то почему?

Спасибо за ваше просвещение!

ответ

2

В большинстве сценариев нет разницы между этими двумя вариантами. Тем не менее, Func может иметь квалификацию operator(). Как следующее:

struct Func { 
    operator()(/* stuff */) &&; 
} 

Это можно назвать только на г-значений, поэтому второй вызов не будет компилировать, так как func внутри myfunction является L-значение. Или она может иметь реф квалификацию перегрузки:

struct Func { 
    operator()(/* stuff */) &; 
    operator()(/* stuff */) &&; 
} 

В этом случае вызов без std::forward будет использовать первую перегрузку независимо от того, что передается myfunction: л-значение или R-значение. Вызов с std::forward, с другой стороны, выберет соответствующую перегрузку, основанную на l-значении пройденного объекта func.

+0

Я обязуюсь. Спасибо, Михаил :) –

+0

Добро пожаловать! – Mikhail