dimanche 13 mars 2022

Forwarding data member of an rvalue calls move constructor

Why is the Foo data member moved in this context?

#include <iostream>

struct Foo
{
    Foo() = default;
    Foo(Foo&&) { std::cout << "move!" << std::endl; }
    Foo(const Foo&) { std::cout << "copy!" << std::endl; }
};
struct Bar
{
    Foo foo{};
};
template<typename T>
void forward_data_member(T&& bar)
{
    const auto foo = std::forward<Foo>(bar.foo);
}
int main()
{
    Bar bar{};
    forward_data_member(bar); // move!
    return 0;
}

I've checked with the debugger - the type of bar is deduced to be an lvalue reference when forward_data_member is called here.

I would assume that a data member of an lvalue reference would also be an lvalue. In fact, it says here that a data member is always an rvalue reference - so I really don't understand this behaviour! https://en.cppreference.com/w/cpp/language/value_category

Any help much appreciated! :-)

Aucun commentaire:

Enregistrer un commentaire