これらの機能は同等ですか?
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
とは 2 つの異なるタイプであることは理解していますが、 とは常に同じ結果になる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));
};
}