Foo product();

Foo consume(Foo foo);


Foo foo; // 이동생성자 구현했다 침


consume(foo); // lvalue라 copy

consume(std:move(foo)); // xvalue라 move

위에는 이전과 동일한데


consume(Foo{});

consume(product());

위처럼 prvalue인 경우에 예전에는 copy elision하거나 move였다면

C++17에서는 copy elision하라고 규정되어있더라


https://en.cppreference.com/w/cpp/language/copy_elision