std::aligned_union - cppreference.com

From cppreference.com

template<std::size_tLen,class...Types>structaligned_union;(since C++11)
(deprecated in C++23)Provides the nested type type, which is a

trivial

standard-layout

type of a size and alignment suitable for use as uninitialized storage for an object of any of the types listed in Types. The size of the storage is at least Len. std::aligned_union also determines the strictest (largest) alignment requirement among all Types and makes it available as the constant alignment_value.

If sizeof...(Types)==0 or if any of the types in Types is not a complete object type, the behavior is undefined.

It is implementation-defined whether any

extended alignment

is supported.

If the program adds specializations for std::aligned_union, the behavior is undefined.

Member types

Name Definition typea trivial and standard-layout type suitable for storage of any type from TypesHelper types

template<std::size_tLen,class...Types>usingaligned_union_t=typenamealigned_union<Len,Types...>::type;(since C++14)
(deprecated in C++23)Member constants

alignment_value

[static]

the strictest alignment requirement of all Types
(public static member constant)Possible implementation

#include<algorithm>template<std::size_tLen,class...Types>structaligned_union{staticconstexprstd::size_talignment_value=std::max({alignof(Types)...});structtype{alignas(alignment_value)char_s[std::max({Len,sizeof(Types)...})];};};Example

Run this code

#include<iostream>#include<string>#include<type_traits>intmain(){std::cout<<sizeof(std::aligned_union_t<0,char>)<<' '// 1<<sizeof(std::aligned_union_t<2,char>)<<' '// 2<<sizeof(std::aligned_union_t<2,char[3]>)<<' '// 3 (!)<<sizeof(std::aligned_union_t<3,char[4]>)<<' '// 4<<sizeof(std::aligned_union_t<1,char,int,double>)<<' '// 8<<sizeof(std::aligned_union_t<12,char,int,double>)<<'\n';// 16 (!)usingvar_t=std::aligned_union<16,int,std::string>;std::cout<<"var_t::alignment_value = "<<var_t::alignment_value<<'\n'<<"sizeof(var_t::type) = "<<sizeof(var_t::type)<<'\n';var_t::typealigned_storage;int*int_ptr=new(&aligned_storage)int(42);// placement newstd::cout<<"*int_ptr = "<<*int_ptr<<'\n';std::string*string_ptr=new(&aligned_storage)std::string("bar");std::cout<<"*string_ptr = "<<*string_ptr<<'\n';*string_ptr="baz";std::cout<<"*string_ptr = "<<*string_ptr<<'\n';string_ptr->~basic_string();}Possible output:

1 2 3 4 8 16 var_t::alignment_value = 8 sizeof(var_t::type) = 32 *int_ptr = 42 *string_ptr = bar *string_ptr = baz Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior

LWG 2979

C++11 complete type was not required requires complete types See also

(C++11)

obtains the type's alignment requirements
(class template)

[edit]

(since C++11)(deprecated in C++23)

defines the type suitable for use as uninitialized storage for types of given size
(class template)

[edit]