我正在阅读cppreferencestd::forward
中的条目。
对于 的第二个重载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::forward
(如果wrapper
引用的参数arg
是左值,forward<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
呢?