次のシグネチャは、std::forward
オーバーロードとして宣言されています。
template<class T> T&& forward(typename remove_reference<T>::type& arg) noexcept;
template<class T> T&& forward(typename remove_reference<T>::type&& arg) noexcept;
ここで、次のテンプレート関数を検討してください。
template<class T> T&& foo_as_always(T&& t)
{
return std::forward<T>(t);
}
私が書く場合:
int i = 0;
foo_as_always(i);
次に、コンパイラがインスタンス化する方法はfoo_as_always
次のT = int&
とおりです。
int& foo_as_always(int& t)
{
// Does it call the first signature of std::forward(int&)
return std::forward<int&>(t);
}
そして、私が書くと:
foo_as_always(0);
次に、コンパイラは次のようにインスタンス化foo_as_always
しT = int
ます。
int&& foo_as_always(int&& t)
{
// Does it call the second signature of std::forward(int&&)?
return std::forward<int>(t);
}
どちらの場合も、t
変数は式の左辺値です。std::forward
コンパイラは、関数のどのオーバーロードを呼び出す必要があるかをどのように認識しますか?