这些功能是否等效?
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 like foo
,有什么理由明确写出类型吗?
我理解T
并且T&&
是两种不同的类型,但我认为std::forward<T>
并且std::forward<T&&>
总是给出相同的结果?
编辑:
我想使用宏的原因是我想在下面的 C++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));
};
}