4

我正在阅读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呢?

4

0 回答 0