Namespaces
Variants

std::indirect<T, Allocator>:: indirect

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)
constexpr explicit indirect ( ) ;
(1) (начиная с C++26)
constexpr explicit indirect ( std:: allocator_arg_t , const Allocator & a ) ;
(2) (начиная с C++26)
template < class U = T >
constexpr explicit indirect ( U && v ) ;
(3) (начиная с C++26)
template < class U = T >

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

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

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

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

constexpr explicit indirect ( std:: in_place_t , std:: initializer_list < I > ilist,

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

constexpr explicit indirect ( std:: allocator_arg_t , const Allocator & a,
std:: in_place_t , std:: initializer_list < I > ilist,

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

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

Содержание

Параметры

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

Эффекты

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

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

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

3-8) Эти перегрузки участвуют в разрешении перегрузки только если std:: is_constructible_v < T, /* argument types */ > равно true , где /* argument types */ это:
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) Эти перегрузки участвуют в разрешении перегрузки только если все следующие значения являются false :

9,10) Если std:: is_copy_constructible_v < T > равно false , программа является некорректной.
11,12) После завершения построения, other становится неимеющим значения.
12) Если std:: allocator_traits < Allocator > :: is_always_equal :: value равно false и T является неполным типом , программа является некорректной.

Исключения

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

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

Пример

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

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