Spec-Zone.ru › C++

std::is_move_constructible, std::is_trivially_move_constructible, std::is_nothrow_move_constructible

Определено в заголовочном файле <type_traits>
template< class T >
struct is_move_constructible;
(1) (с C++11)
template< class T >
struct is_trivially_move_constructible;
(2) (с C++11)
template< class T >
struct is_nothrow_move_constructible;
(3) (с C++11)
1) Если T не является ссылкой на тип (то есть, возможно, с квалификаторами cv, void, или типом функции с cv-qualifier-seq или ref-qualifier), предоставляет статический член value, равный false. В противном случае предоставляет статический член value, равный std::is_constructible<T, T&&>::value.
2) То же, что и (1), но использует std::is_trivially_constructible<T, T&&>.
3) То же, что и (1), но использует std::is_nothrow_constructible<T, T&&>.

T должен быть полным типом, (возможно, с квалификаторами cv) void или массивом с неизвестной границей. В противном случае поведение не определено.

Если экземпляр шаблона выше зависит прямо или косвенно от неполного типа, и этот экземпляр мог бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.

Поведение программы, которая добавляет специализации для любого из шаблонов, описанных на этой странице, не определено.

Вспомогательные шаблонные переменные

template< class T >
inline constexpr bool is_move_constructible_v =
    is_move_constructible<T>::value;
(с C++17)
template< class T >
inline constexpr bool is_trivially_move_constructible_v =
    is_trivially_move_constructible<T>::value;
(с C++17)
template< class T >
inline constexpr bool is_nothrow_move_constructible_v =
    is_nothrow_move_constructible<T>::value;
(с C++17)

Наследуется от std::integral_constant

Статические члены

value
[static]
true если T является перемещаемо-конструктируемым типом, false в противном случае
(публичный статический член)

Члены-функции

operator bool
преобразует объект в bool, возвращает value
(публичный член-функция)
operator()
(C++14)
возвращает value
(публичный член-функция)

Типы-члены

Тип Определение
value_type bool
type std::integral_constant<bool, value>

Возможная реализация

template<class T>
struct is_move_constructible :
    std::is_constructible<T, typename std::add_rvalue_reference<T>::type> {};
 
template<class T>
struct is_trivially_move_constructible :
    std::is_trivially_constructible<T, typename std::add_rvalue_reference<T>::type> {};
 
template<class T>
struct is_nothrow_move_constructible :
    std::is_nothrow_constructible<T, typename std::add_rvalue_reference<T>::type> {};

Примечания

Типы без перемещаемого конструктора, но с копирующим конструктором, принимающим const T& аргументы, удовлетворяют std::is_move_constructible.

Перемещаемые конструкторы обычно noexcept, так как в противном случае они непригодны в любом коде, который обеспечивает сильную гарантию от исключений.

Во многих реализациях std::is_nothrow_move_constructible также проверяет, выбрасывает ли деструктор исключение, так как он фактически noexcept(T(arg)). То же самое относится к std::is_trivially_move_constructible, который в этих реализациях также требует, чтобы деструктор был тривиальным: GCC bug 51452, LWG issue 2116.

Пример

#include <iostream>
#include <type_traits>
 
struct Ex1
{
    std::string str; // member has a non-trivial but non-throwing move ctor
};
 
struct Ex2
{
    int n;
    Ex2(Ex2&&) = default; // trivial and non-throwing
};
 
struct NoMove
{
    // prevents implicit declaration of default move constructor
    // however, the class is still move-constructible because its
    // copy constructor can bind to an rvalue argument
    NoMove(const NoMove&) {}
};
 
#define OUT(...) std::cout << #__VA_ARGS__ << " : " << __VA_ARGS__ << '\n'
 
int main()
{
    std::cout << std::boolalpha;
    OUT(std::is_move_constructible_v<Ex1>);
    OUT(std::is_trivially_move_constructible_v<Ex1>);
    OUT(std::is_nothrow_move_constructible_v<Ex1>);
    OUT(std::is_trivially_move_constructible_v<Ex2>);
    OUT(std::is_nothrow_move_constructible_v<Ex2>);
    OUT(std::is_move_constructible_v<NoMove>);
    OUT(std::is_nothrow_move_constructible_v<NoMove>);
}

Вывод:

std::is_move_constructible_v<Ex1> : true
std::is_trivially_move_constructible_v<Ex1> : false
std::is_nothrow_move_constructible_v<Ex1> : true
std::is_trivially_move_constructible_v<Ex2> : true
std::is_nothrow_move_constructible_v<Ex2> : true
std::is_move_constructible_v<NoMove> : true
std::is_nothrow_move_constructible_v<NoMove> : false

См. также

is_constructibleis_trivially_constructibleis_nothrow_constructible
(C++11)(C++11)(C++11)
проверяет, имеет ли тип конструктор для определённых аргументов
(шаблон класса)
is_default_constructibleis_trivially_default_constructibleis_nothrow_default_constructible
(C++11)(C++11)(C++11)
проверяет, имеет ли тип конструктор по умолчанию
(шаблон класса)
is_copy_constructibleis_trivially_copy_constructibleis_nothrow_copy_constructible
(C++11)(C++11)(C++11)
проверяет, имеет ли тип копирующий конструктор
(шаблон класса)
move_constructible
(C++20)
задаёт, что объект типа может быть перемещаемо-сконструирован
(концепт)
move
(C++11)
получает ссылку на временное значение
(шаблон функции)
move_if_noexcept
(C++11)
получает ссылку на временное значение, если перемещающий конструктор не выбрасывает исключения
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/is_move_constructible

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API