【发布时间】:2019-06-02 16:23:12
【问题描述】:
在std::forward的doc中,给出了如下例子:
template<class T>
void wrapper(T&& arg)
{
foo(forward<decltype(forward<T>(arg).get())>(forward<T>(arg).get()));
}
为什么这里需要转发返回值?和下面的代码有什么不同的情况:
template<class T>
void wrapper(T&& arg)
{
foo(forward<T>(arg).get());
}
【问题讨论】:
-
请参阅您在en.cppreference.com/w/cpp/utility/forward 中提到的行下方的激励示例。它指的是底层 get() 函数有 2 个实现的情况。一种可以修改成员值:
int & get() & {return i;},另一种不能修改int get() && {return i;} -
@indeterminatelysequenced 我还是不明白。
forward<T>(arg).get()的类型不会和forward<decltype(forward<T>(arg).get())>的参数一样,那为什么这里需要forward呢? -
我也有同样的困惑。表达式
forward<T>(arg).get()已经在正确的值类别中,所以我想说没有必要转发。
标签: c++ c++11 c++14 perfect-forwarding