Namespaces
Variants

std::polymorphic<T, Allocator>:: polymorphic

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода - присутствуют только HTML-теги и атрибуты, которые согласно инструкциям не подлежат переводу)
constexpr explicit polymorphic ( ) ;
(1) (начиная с C++26)
constexpr explicit polymorphic ( std:: allocator_arg_t , const Allocator & a ) ;
(2) (начиная с C++26)
template < class U = T >
constexpr explicit polymorphic ( U && v ) ;
(3) (начиная с C++26)
template < class U = T >

constexpr explicit polymorphic ( std:: allocator_arg_t , const Allocator & a,

U && v ) ;
(4) (начиная с C++26)
template < class U, class ... Args >
constexpr explicit polymorphic ( std:: in_place_type_t < U > , Args && ... args ) ;
(5) (начиная с C++26)
template < class U, class ... Args >

constexpr explicit polymorphic ( std:: allocator_arg_t , const Allocator & a,

std:: in_place_type_t < U > , Args && ... args ) ;
(6) (начиная с C++26)
template < class U, class I, class ... Args >

constexpr explicit polymorphic ( std:: in_place_type_t < U > ,
std:: initializer_list < I > ilist,

Args && ... args ) ;
(7) (начиная с C++26)
template < class U, class I, class ... Args >

constexpr explicit polymorphic ( std:: allocator_arg_t , const Allocator & a,
std:: in_place_type_t < U > ,
std:: initializer_list < I > ilist,

Args && ... args ) ;
(8) (начиная с C++26)
constexpr polymorphic ( const polymorphic & other ) ;
(9) (начиная с C++26)
constexpr polymorphic ( std:: allocator_arg_t , const Allocator & a,
const polymorphic & other ) ;
(10) (начиная с C++26)
constexpr polymorphic ( polymorphic && other ) noexcept ;
(11) (начиная с C++26)
constexpr polymorphic ( std:: allocator_arg_t , const Allocator & a,
polymorphic && other ) noexcept ( /* см. ниже */ ) ;
(12) (начиная с C++26)

Создает новый polymorphic объект.

Содержание

Параметры

a - аллокатор, который будет ассоциирован
v - значение для инициализации владеемого значения
args - аргументы для инициализации владеемого значения
il - список инициализации для инициализации владеемого значения
other - другой polymorphic объект, чье владеемое значение (если существует) копируется

Эффекты

Создание нового polymorphic объекта состоит из следующих шагов:

1) Конструирует связанный аллокатор alloc :
2) Создает содержащийся объект:
  • Для перегрузок ( 1-8 ) , вызывает std:: allocator_traits < Allocator > :: construct ( alloc  , p, args... ) , где
    • p - указатель типа U* , который указывает на память, подходящую для создания содержащегося объекта, и
    • args... - пакет выражений, содержащий аргументы инициализации.
  • Для перегрузок ( 9-12 ) :
    • Если other не содержит значения, содержащийся объект не создается, и * this также не содержит значения после создания.
    • Иначе, если other является rvalue-ссылкой и alloc равен other. alloc , * this принимает владение содержащимся объектом из other .
    • Иначе, содержащийся объект создается с использованием alloc как описано выше, где тип p определяется типом объекта, содержащегося в other .
Перегрузка Инициализатор для... Тип владеемого объекта valueless_after_move()
после конструирования
alloc владеемого объекта
( 1 ) (пусто) (пусто) T false
( 2 ) a
( 3 ) (пусто) std:: forward < U > ( v ) U
( 4 ) a
( 5 ) (пусто) std:: forward < Args > ( args )
( 6 ) a
( 7 ) (пусто) ilist,
std:: forward < Args > ( args )
( 8 ) a
( 9 ) см. ниже * other
(только если other владеет значением)
тип объекта, которым владеет other true только если other не содержит значения
( 10 ) a
( 11 ) std :: move 
( other. alloc  )
принимает владение
(только если other владеет значением)
( 12 ) a см. ниже
9) alloc инициализируется прямым несписочным образом с помощью std:: allocator_traits < Allocator > ::
select_on_container_copy_construction ( other. alloc  )
.
12) Принадлежащий объект конструируется следующим образом:
  • Если other не содержит значения, * this также не содержит значения.
  • Иначе, если alloc == other. alloc равно true , * this принимает владение принадлежащим объектом other .
  • Иначе, конструирует принадлежащий объект с помощью * std :: move ( other ) используя alloc .

Ограничения и дополнительная информация

1,2) Если любое из следующих значений равно false , программа является некорректной:

1) Эта перегрузка участвует в разрешении перегрузки только если std:: is_default_constructible_v < Allocator > равно true .

3-8) Эти перегрузки участвуют в разрешении перегрузки только если все следующие значения true :
3,4) U
5,6) Args...
7,8) std:: initializer_list < I > & , Args...

3,5,7) Эти перегрузки участвуют в разрешении перегрузки только если std:: is_default_constructible_v < Allocator > равно true .
3,4) Эти перегрузки участвуют в разрешении перегрузки только при выполнении всех следующих условий:
5-8) Эти перегрузки участвуют в разрешении перегрузки только если std:: is_same_v < std:: remove_cvref_t < U > , U > равно true .

Исключения

Ничего не выбрасывает, если только std:: allocator_traits < Allocator > :: allocate или std:: allocator_traits < Allocator > :: construct не выбрасывают исключение.

12)
noexcept спецификация:
noexcept ( std:: allocator_traits < Allocator > :: is_always_equal :: value )

Пример

Смотрите также

тип-метка, используемый для выбора перегрузок конструкторов с поддержкой аллокаторов
(класс)
метка для конструирования на месте
(метка)