There is a blog series on writing an operating system in Rust.

motion is really powerful.

Passing by value and then moving into an instance variable will incur the cost of copy and move construction.

$ cat moves.cpp
#include <iostream>

struct Foo
{
    Foo() = default;
    Foo(Foo &) { std::cout << "Copy construction" << std::endl; }
    Foo(Foo &&) { std::cout << "Move construction" << std::endl; }
};

struct Sink
{
    Sink(Foo f) : _f(std::move(f)) {}
    Foo _f;
};

int main()
{
    Foo f;
    Sink s(f);
}
$ c++ -std=c++11 moves.cpp
$ ./a.out
Copy construction
Move construction

Member functions can be rvalue or lvalue reference qualified.