эти функции эквивалентны?
template <class T>
void foo(T && t)
{
bar(std::forward<T>(t));
}
template <class T>
void foo2(T && t)
{
bar(std::forward<decltype(t)>(t));
}
template <class T>
void foo3(T && t)
{
bar(std::forward(t));
}
если они есть, могу ли я всегда использовать этот макрос для идеальной пересылки?
#define MY_FORWARD(var) std::forward<decltype(var)>(var)
или просто используйте
bar(std::forward(t));
Я считаю, что foo2
и foo3
такие же, но я обнаружил, что люди всегда используют forward, как foo
, есть ли причина явно писать тип?
Я понимаю, что T
и T&&
- два разных типа, но я думаю, что std::forward<T>
и std::forward<T&&>
всегда дают тот же результат?
Edit:
причина, по которой я хочу использовать макрос, - это то, что я хочу сохранить некоторую типизацию в следующем коде С++ 1y, у меня есть много похожих кодов в разных местах
#define XLC_FORWARD_CAPTURE(var) var(std::forward<decltype(var)>(var))
#define XLC_MOVE_CAPTURE(var) var(std::move(var))
template <class T, class U>
auto foo(T && func, U && para )
{
auto val = // some calculation
return [XLC_FORWARD_CAPTURE(func),
XLC_FORWARD_CAPTURE(para),
XLC_MOVE_CAPTURE(val)](){
// some code use val
func(std::forward<U>(para));
};
}