As I understand rvalue being passed as an argument into function becomes lvalue, std::forward returns rvalue if argument was passed as rvalue and lvalue if it was passed as lvalue. Here is my class:
#include <string>
#include <iostream>
struct MyClass
{
    MyClass()
    {
        std::cout << "default";
    }
    MyClass(const MyClass& copy)
    {
        std::cout << "copy";
    }
    MyClass& operator= (const MyClass& right)
    {
        std::cout << "=";
        return *this;
    }
    MyClass& operator= (const MyClass&& right)
    {
        std::cout << "mov =";
        return *this;
    }
    MyClass(MyClass&& mov)
    {
        std::cout << "mov constructor";
    }
};
void foo(MyClass s)
{
    MyClass z = MyClass(std::forward<MyClass>(s));
}
void main()
{
    auto a = MyClass();
    foo(MyClass()); //z is created by move_constructor
    foo(a); //z is created by move_constructor, but I think it must be created using copy constructor
}
My question is: why z variable is created using move_constructor in both cases. I thought it must be moved in first case foo(MyClass()) and copied in 2nd case foo(a). In second case I pass lvalue as argument s, and std::forward must return lvalue, that is then is passed as lvalue reference into MyClass constructor. Where am I wrong?
 
     
    