【发布时间】:2023-11-06 13:04:01
【问题描述】:
我在 std 库中找到了 std::forward 的以下实现:
// TEMPLATE FUNCTION forward
template<class _Ty> inline
constexpr _Ty&& forward(
typename remove_reference<_Ty>::type& _Arg) _NOEXCEPT
{ // forward an lvalue as either an lvalue or an rvalue
return (static_cast<_Ty&&>(_Arg));
}
template<class _Ty> inline
constexpr _Ty&& forward(
typename remove_reference<_Ty>::type&& _Arg) _NOEXCEPT
{ // forward an rvalue as an rvalue
static_assert(!is_lvalue_reference<_Ty>::value, "bad forward call");
return (static_cast<_Ty&&>(_Arg));
}
第一个函数显然有效,但第二个我找不到有用的例子。 如果我尝试做这样的事情:
template<class _Ty> inline
constexpr _Ty&& my_forward(
typename std::remove_reference<_Ty>::type&& _Arg) _NOEXCEPT
{ // forward an rvalue as an rvalue
static_assert(!std::is_lvalue_reference<_Ty>::value, "bad forward call");
return (static_cast<_Ty&&>(_Arg));
}
template<typename T>
T getRValue()
{
return std::remove_reference<T>::type{};
}
template<typename T>
void setValue(T && i)
{
my_forward<T>(getRValue<T>());
}
int main()
{
int i = 1;
setValue(i);
}
检查第二个函数何时被调用,我得到了错误:
Error C2664 '_Ty my_forward<T>(int &&) noexcept': cannot convert argument 1 from 'int' to 'int &&'
有谁知道在哪种情况下调用第二个重载函数(用我的话来说是 my_forward)? 或者可能是一些很好的例子? 顺便说一句,我的编译器是 MSVC 2015
谢谢大家帮忙!!
【问题讨论】:
-
评论说“将右值作为右值转发”,但您将
rvalue左值作为左值转发(并且还有未定义行为的情况)。这不是编写函数的目的。 -
@Johannes Schaub:为什么? getRValue() 提供prvalue,它可以作为my_forward的参数。你能举一个有用的例子,在我的例子中使用 my_forward 作为右值吗?
-
@DenisKotov: "getRValue() 提供prvalue" 是吗?它返回一个
T,但T可以是一个引用。因此,它可能是一个左值。 -
@Johannes Schaub:抱歉不正确。它是xvalue,而不是lvalue,因为函数的返回值可以被重用,但它还没有名字
-
这个也很相关——*.com/q/29135698/241631
标签: c++ c++11 forward-declaration