C++ - 使用右值引用 [重复] 时,模板不会推断出适当的类型

C++ - Template won't deduce the appropriate type when using an rvalue reference [duplicate]

提问人:IRP_HANDLER 提问时间:11/16/2023 最后编辑:IRP_HANDLER 更新时间:11/16/2023 访问量:42

问:

我对左值和右值绑定有点困惑,我有以下代码:

void MyFunction( int& value ) 
{
    std::cout << "Lvalue reference: " << value << std::endl;
}

void MyFunction( int&& value ) 
{
    std::cout << "Rvalue reference: " << value << std::endl;
}

template <typename T>
void genericFunction( T&& arg ) 
{
    
    myFunction( std::forward<T>( arg ) );
  
   
   // myFunction( arg );
}

int main() 
{
    int x = 42;

    genericFunction( x ); 
    genericFunction( 100 );  
}

现在,这工作正常,使用 x 调用 genericFunction 调用 lvalue 变体,同时使用整数文字调用它,调用 r 值变体。

但是,如果我删除 std::forward,它将调用这两个值的左值版本,这是为什么?是因为我的右值引用绑定到左值引用(不确定这是否有意义)?

我设置了一个断点,看到对于第一次调用,T 的推导类型是 int &,这是预期的,而第二次调用中 T 的推导类型是 int&&,这是一个右值引用,那么如果我不使用 std::forward,为什么它会调用 l 值版本?

C++ STL 模板-元编程 右值 lvalue

评论

5赞 Jerry Coffin 11/16/2023
这可能有很多重复项,但简短的回答是,即使是一个右值引用,这基本上意味着它是右值的引用(或者,因为这是一个模板,所以是对右值或左值的引用)。由于它是有名称的东西,所以它本身就是一个 ,所以如果你尝试传递它(没有),你就传递了一个左值,所以左值重载将被选中。argarglvaluestd::forward
2赞 Ted Lyngmo 11/16/2023
这就是为什么首先需要它。它将参数转发给另一个函数,其值类别在传递给调用函数时具有。如果保留它,而只是在里面引用它,那会很方便,但那里只是一个 lvalue。std::forwardarggenericFunction
1赞 Weijun Zhou 11/16/2023
不得不重申这一点。 是表达式的值类别。 是变量的一种类型。它们是不同的东西。作为表达式的参数的值类别决定了将调用哪个重载,并且在函数内部,您有 either 或 类型的变量,但是当单独用作表达式时,值类别始终为 。rvaluervalue referencelvalue referencervalue referencelvalue

答: 暂无答案