将右值传递给函数

Passing an rvalue to a function

我看了很多关于右值links的资料,我都明白了,但是我遇到了这个例子:

template<class T, class Arg>
T* make_raw_ptr(Arg &&arg)
{
    return new T(arg);
}; 

如果不使用my_forward函数而将右值传递给make_raw_ptr函数,则在使用new T时,将有一个复制构造函数,而不是移动构造函数。我知道 arg 将是左值,尽管它是一个右值引用,但我有一个问题。为什么在 static_cast arg 已经是右值 link 的情况下将 static_cast arg 设为右值 link,而使用 static_cast<A&&> 作为参数时,移动构造函数将被调用?

arg本身是一个表达式,表示arg所引用的对象,它的值类别是lvaluearg 实际上是什么类型并不重要。变量/函数参数本身的名称始终是左值表达式。

static_cast<A&&>(arg) 是表示与 arg 完全相同的对象的表达式,但它的类别是 rvalue(和 xvalue).当您使用此表达式作为构造函数参数时,移动构造函数将是首选。 std::move(arg).

效果相同