【发布时间】:2017-05-14 08:25:28
【问题描述】:
我想我对std::forward 感到困惑。
我使用std::forward 的函数如下,但为了便于解释,它做了很多简化和修改。
// This is an example code to explain my question simply.
template <typename Element>
void add(Element&& element) {
static std::vector vec;
vec.push_back(std::forward<Element>(element));
}
我用上面的函数尝试了两种情况;案例 1 左值参数和案例 2 右值参数。
案例1:左值参数
auto some_class = SomeClass();
add(some_class);
案例 2:右值参数
add(SomeClass());
在调试器中,这两种情况都传递了相同的以下部分,std::forward 部分和 std::vector 部分。
std::forward 部分:
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type& __t) noexcept
{ return static_cast<_Tp&&>(__t); }
std::vector 部分:
#if __cplusplus >= 201103L
void
push_back(value_type&& __x)
{ emplace_back(std::move(__x)); }
似乎std::forward 部分将两种情况都转换为右值引用&&,因为它使用static_cast<_Tp&&>。并且std::vector 将两个元素都视为右值引用,因为它使用了std::move()。
我预计案例 1 的扩充是左值,因为它有自己的名称,而案例 2 是右值,因为它没有自己的名称。
我还期望 std::forward 将案例 1 转换为左值引用,将案例 2 转换为右值引用。
我对左值、右值和std::forward 的理解是否正确?如果是这样,为什么std::forward 将两者都转换为右值引用&&。
如果我犯了错误,很抱歉耽误您的时间。
【问题讨论】: