4

cppreferencestd::forwardのエントリを読んでいます。

の 2 番目のオーバーロードについては、次std::forwardの例があります。

template<class T>
void wrapper(T&& arg)
{
    foo(forward<decltype(forward<T>(arg).get())>(forward<T>(arg).get()));
}

の型がどこにargあるか

struct Arg
{
    int i = 1;
    int  get() && { return i; } // call to this overload is rvalue
    int& get() &  { return i; } // call to this overload is lvalue
};

ただし、左辺値か右辺値かは (参照する引数が左辺値の場合は左辺値、そうでない場合は右辺値)forward<T>(arg).get()を使用しなくても区別できます。次のプログラムはサポートです。std::forwardwrapperargforward<T>(arg).get()

#include <iostream>
#include <utility>

struct Arg
{
    int i = 1;
    int  get() && { return i; } // call to this overload is rvalue
    int& get() &  { return i; } // call to this overload is lvalue
};

void foo(int&)  {std::cout << "lvalue\n";}
void foo(int&&) {std::cout << "rvalue\n";}

template<class T>
void wrapper(T&& arg)
{
    foo(std::forward<T>(arg).get()); // without the use of outer forward
}

int main()
{
    Arg arg;
    wrapper(arg);
    wrapper(static_cast<Arg&&>(arg));
}

実行結果

では、アウターの用途は何std::forwardですか?

4

0 に答える 0