'Passing an rvalue to a function
I read a lot of information about rvalue links, I understood everything, but I met this example:
template<class T, class Arg>
T* make_raw_ptr(Arg &&arg)
{
return new T(arg);
};
If you pass rvalue to the make_raw_ptr
function without using the my_forward function, when using new T, there will be a copy constructor, not a move constructor. I understand that arg
will be lvalue, despite the fact that it is an rvalue reference, but I have one question. Why make a static_cast
arg
to an rvalue link when it is already an rvalue link, while using a static_cast<A&&>
to arg, the move constructor will be called?
Solution 1:[1]
arg
itself is an expression that represents an object referred to by arg
and its value category is lvalue. It doesn't matter what the type of arg
actually is. A name of a variable / function parameter itself is always an lvalue expression.
static_cast<A&&>(arg)
is an expression that represents the very same object as arg
, but its category is rvalue (and xvalue). When you use this expression as the constructor argument, the move constructor will be preferred. The same effect is with std::move(arg)
.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Daniel Langr |