我对 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));
}
我尝试使用上述函数进行了两种情况的测试;第一种情况是lvalue参数,第二种情况是rvalue参数。
情况1:lvalue参数
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()
。我原本预期Case 1的增量是左值,因为它有自己的名称,而Case 2是右值,因为它没有自己的名称。 我也预期
std::forward
会将Case 1转换为左值引用,Case 2转换为右值引用。
我的对左值、右值和std::forward
的理解正确吗?如果是这样,为什么std::forward
将两者都转换为右值引用,&&
。如果我犯了错误,很抱歉浪费了您的时间。