std::forward
への引数の値カテゴリを保持するには、 を使用する必要がありますfn()
。引数は 内fn
で名前を持っているため、左辺値であり、そうでないstd::forward
場合は常にそのまま に渡されstd::forward_as_tuple
ます。
違いは、次の例を使用して実証できます。
template<typename T>
void bar2(T&& t)
{
std::cout << __PRETTY_FUNCTION__ << ' '
<< std::is_rvalue_reference<decltype(t)>::value << '\n';
}
template<typename T>
void bar1(T&& t)
{
std::cout << __PRETTY_FUNCTION__ << ' '
<< std::is_rvalue_reference<decltype(t)>::value << '\n';
bar2(std::forward<T>(t));
bar2(t);
}
bar1
は常に引数を に渡します。bar2
一度はstd::forward
あり、一度はなしです。それでは、左辺値と右辺値の引数でそれらを呼び出しましょう。
foo f;
bar1(f);
std::cout << "--------\n";
bar1(foo{});
出力:
void bar1(T&&) [with T = foo&] 0
void bar2(T&&) [with T = foo&] 0
void bar2(T&&) [with T = foo&] 0
--------
void bar1(T&&) [with T = foo] 1
void bar2(T&&) [with T = foo] 1
void bar2(T&&) [with T = foo&] 0
出力からわかるように、どちらの場合も を使用せずにstd::forward
、引数は左辺値として に渡されbar2
ます。