6

次のシグネチャは、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_alwaysT = 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コンパイラは、関数のどのオーバーロードを呼び出す必要があるかをどのように認識しますか?

4

1 に答える 1