Какая польза от пересылки rvalue?

Я читаю запись std::forward в cppreference.

Для второй перегрузки 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() lvalue или rvalue без использования std::forward (если аргумент wrapper, относящийся к arg, является lvalue, forward<T>(arg).get() является lvalue; в противном случае это rvalue). Следующая программа является вспомогательной:

#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?


person xskxzr    schedule 09.01.2017    source источник