C++ named requirements: MoveConstructible (since C++11)
Specifies that an instance of the type can be constructed from an rvalue argument.
Requirements
The type T satisfies MoveConstructible if
Given
rv, an rvalue expression of typeT,u, an arbitrary identifier.
The following expressions must be valid and have their specified effects.
| Expression | Post-conditions |
|---|---|
T u = rv;
|
The value of u is equivalent to the value of rv before the initialization.
The new value of |
T(rv)
|
The value of T(rv) is equivalent to the value of rv before the initialization.
The new value of |
Notes
A class does not have to implement a move constructor to satisfy this type requirement: a copy constructor that takes a const T& argument can bind rvalue expressions.
If a MoveConstructible class implements a move constructor, it may also implement move semantics to take advantage of the fact that the value of rv after construction is unspecified.
| Extended content |
|---|
|
Being a MoveConstructible class implies std::is_move_constructible but not vice versa since std::is_move_constructible will only check for the ability to call the constructor with the correct arguments, not a post-condition value. Run this code #include <iostream>
struct S
{
int n;
S(int in) : n{in} {}
S(S&& other) { n = other.n + 1; }
};
static_assert(std::is_move_constructible_v<S>);
int main()
{
S v{1};
std::cout << "v.n = " << v.n << '\n';
S u = std::move(v);
// Class `S` doesn't satisfy a MoveConstructible requirement
// The value of `u` is NOT equivalent to the value of `v` before the `u` initialization
std::cout << "u.n = " << u.n << '\n';
}
Output: v.n = 1
u.n = 2
|
References
| Extended content |
|---|
|
See also
(C++11)(C++11)(C++11) |
checks if a type can be constructed from an rvalue reference (class template) |
(C++20) |
specifies that an object of a type can be move constructed (concept) |