Specifies that an instance of the type can be constructed from an rvalue argument.
[edit] RequirementsThe type T
satisfies MoveConstructible if
Given
rv
, an rvalue expression of type T
,u
, an arbitrary identifier.The following expressions must be valid and have their specified effects.
Expression Post-conditions T u = rv; The value ofu
is equivalent to the value of rv
before the initialization.
The new value of rv
is unspecified.
T(rv)
is equivalent to the value of rv
before the initialization.
The new value of rv
is unspecified.
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.
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[edit] References Extended content
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4