gpt4 book ai didi

C++ 通用引用。为什么右值引用变成左值?

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:32 25 4
gpt4 key购买 nike

这是困扰我的代码

‍‍‍‍‍#include <iostream>

#include "DataItem.h"


void testRef( const int & param )
{
std::cout << "Lvalue reference" << std::endl;
}

void testRef( int && param )
{
std::cout << "Rvalue reference" << std::endl;

// Here's the thing I can't get. Why param is lvalue reference here??
testRef( param );
}


template<class T>
void func( T && param )
{
testRef( std::forward<T>( param ) );
}


int main2()
{
int a = 12;
func( a );

std::cout << "=================" << std::endl;

func( 14 );

std::cout << "=================" << std::endl;

return 0;
}

当我在 testRef( int && param ) 中调用 testRef() 时,我认为只要 param 是右值引用,ravalue 函数就会被调用(是的,永恒的会发生递归)。但是调用了左值函数。为什么?

最佳答案

这样想,你用了std::forward<T>func ,所以同样地,为了确保参数作为右值引用被转发,你必须在递归函数中做同样的事情:

void testRef(int && param)
{
std::cout << "Rvalue reference" << std::endl;

// Here's the thing I can't get. Why param is lvalue reference here??
testRef( param );

testRef(std::forward<int &&>(param)); // now it will stay an Rvalue reference
testRef(std::move(param)); // make it an Rvalue reference
}

我们需要的原因std::forwardstd::move是因为param类型为 int&&这是一个左值(即,右值引用参数在您使用时是一个左值表达式)。

在幕后,这些模板最终将执行 static_cast<int &&>它产生一个 xvalue 表达式(也被归类为 rvalue 表达式。) xvalue 表达式绑定(bind)到 rvalue 引用参数。

这可以通过查看 Clang's syntax tree 看出对于以下功能:

             rvalue reference parameter (which binds to rvalue expressions)
vvvvvvvvvvv
void testRef(int&& param)
{
//std::move(param);

lvalue expression of type int&&
vvvvv
static_cast<int &&>(param);
^^^^^^^^^^^^^^^^^^^^^^^^^^
xvalue expression
(considered an rvalue expression which binds to rvalue reference parameters)
}

上述函数的抽象语法树:

TranslationUnitDecl
`-FunctionDecl <line:3:1, line:7:1> line:3:6 testRef 'void (int &&)'
|-ParmVarDecl <col:14, col:21> col:21 used param 'int &&'
`-CompoundStmt <line:4:1, line:7:1>
`-CXXStaticCastExpr <line:6:5, col:30> 'int' xvalue static_cast<int &&> <NoOp>
`-DeclRefExpr <col:25> 'int' lvalue ParmVar 0x55a692bb0a90 'param' 'int &&'

解释引用参数成为左值的一种简写方式是说,当它有一个名称(id 表达式)时,它就是一个左值。

关于C++ 通用引用。为什么右值引用变成左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55210225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com