[simd.ctor] # 29 Numerics library [[numerics]](./#numerics) ## 29.10 Data-parallel types [[simd]](simd#ctor) ### 29.10.7 Class template basic_vec [[simd.class]](simd.class#simd.ctor) #### 29.10.7.2 basic_vec constructors [simd.ctor] [🔗](#lib:basic_vec,constructor) `template constexpr explicit(see below) basic_vec(U&& value) noexcept; ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17699) Let From denote the type remove_cvref_t[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17702) *Constraints*: value_type satisfies [constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_­from [concept.constructible]")[.](#2.sentence-1) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17706) *Effects*: Initializes each element to the value of the argument after conversion tovalue_type[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17711) *Remarks*: The expression inside explicit evaluates to false if and only ifU satisfies [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]"), and either - [(4.1)](#4.1) From is not an arithmetic type and does not satisfy [*constexpr-wrapper-like*](simd.expos#concept:constexpr-wrapper-like "29.10.2 Exposition-only types, variables, and concepts [simd.expos]"), - [(4.2)](#4.2) From is an arithmetic type and the conversion from From to value_type is value-preserving ([[simd.general]](simd.general "29.10.1 General")), or - [(4.3)](#4.3) From satisfies [*constexpr-wrapper-like*](simd.expos#concept:constexpr-wrapper-like "29.10.2 Exposition-only types, variables, and concepts [simd.expos]"), remove_const_t is an arithmetic type, and From​::​value is representable by value_type[.](#4.sentence-1) [🔗](#lib:basic_vec,constructor_) `template constexpr explicit(see below) basic_vec(const basic_vec& x) noexcept; ` [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17736) *Constraints*: *simd-size-v* == size() is true[.](#5.sentence-1) [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17740) *Effects*: Initializes the ith element with static_cast(x[i]) for all i in the range of [0, size())[.](#6.sentence-1) [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17745) *Remarks*: The expression inside explicit evaluates to true if either - [(7.1)](#7.1) the conversion from U to value_type is not value-preserving, or - [(7.2)](#7.2) both U and value_type are integral types and the integer conversion rank ([[conv.rank]](conv.rank "6.9.6 Conversion ranks")) of U is greater than the integer conversion rank of value_type, or - [(7.3)](#7.3) both U and value_type are floating-point types and the floating-point conversion rank ([[conv.rank]](conv.rank "6.9.6 Conversion ranks")) of U is greater than the floating-point conversion rank of value_type[.](#7.sentence-1) [🔗](#lib:basic_vec,constructor__) `template constexpr explicit basic_vec(G&& gen); ` [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17769) Let Fromi denote the typedecltype(gen(integral_constant<*simd-size-type*, i>()))[.](#8.sentence-1) [9](#9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17773) *Constraints*: Fromi satisfies [convertible_to](concept.convertible#concept:convertible_to "18.4.4 Concept convertible_­to [concept.convertible]") for all i in the range of [0, size())[.](#9.sentence-1) In addition, for all i in the range of [0, size()), if Fromi is an arithmetic type, conversion from Fromi to value_type is value-preserving[.](#9.sentence-2) [10](#10) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17781) *Effects*: Initializes the ith element withstatic_cast(gen(integral_constant<*simd-​size-​type*, i>())) for all i in the range of [0, size())[.](#10.sentence-1) [11](#11) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17787) *Remarks*: gen is invoked exactly once for each i, in increasing order of i[.](#11.sentence-1) [🔗](#lib:basic_vec,constructor___) `template constexpr basic_vec(R&& r, flags = {}); template constexpr basic_vec(R&& r, const mask_type& mask, flags = {}); ` [12](#12) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17801) Let mask be mask_type(true) for the overload with nomask parameter[.](#12.sentence-1) [13](#13) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17805) *Constraints*: - [(13.1)](#13.1) R models ranges​::​[contiguous_range](range.refinements#concept:contiguous_range "25.4.6 Other range refinements [range.refinements]") and ranges​::​[sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]"), - [(13.2)](#13.2) ranges​::​size(r) is a constant expression, and - [(13.3)](#13.3) ranges​::​size(r) is equal to size()[.](#13.sentence-1) [14](#14) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17814) *Mandates*: - [(14.1)](#14.1) ranges​::​range_value_t is a vectorizable type, and - [(14.2)](#14.2) if the template parameter pack Flags does not contain *convert-flag*, then the conversion from ranges​::​range_value_t to value_type is value-preserving[.](#14.sentence-1) [15](#15) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17825) *Preconditions*: - [(15.1)](#15.1) If the template parameter pack Flags contains *aligned-flag*, ranges​::​data(r) points to storage aligned by alignment_v>[.](#15.1.sentence-1) - [(15.2)](#15.2) If the template parameter pack Flags contains *overaligned-flag*, ranges​::​data(r) points to storage aligned by N[.](#15.2.sentence-1) [16](#16) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17839) *Effects*: Initializes the ith element with mask[i] ?static_cast(​ranges​::​​data(r)[i]) : T() for all i in the range of [0, size())[.](#16.sentence-1) [🔗](#itemdecl:5) `template basic_vec(R&& r, Ts...) -> see below; ` [17](#17) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17852) *Constraints*: - [(17.1)](#17.1) R models ranges​::​[contiguous_range](range.refinements#concept:contiguous_range "25.4.6 Other range refinements [range.refinements]") and ranges​::​[sized_range](range.sized#concept:sized_range "25.4.4 Sized ranges [range.sized]"), and - [(17.2)](#17.2) ranges​::​size(r) is a constant expression[.](#17.sentence-1) [18](#18) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17860) *Remarks*: The deduced type is equivalent to vec, ranges​::​size(r)>[.](#18.sentence-1) [🔗](#lib:basic_vec,constructor____) `template<[simd-floating-point](simd.expos#concept:simd-floating-point "29.10.2 Exposition-only types, variables, and concepts [simd.expos]") V> constexpr explicit(see below) basic_vec(const V& reals, const V& imags = {}) noexcept; ` [19](#19) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17874) *Constraints*: - [(19.1)](#19.1) [*simd-complex*](simd.expos#concept:simd-complex "29.10.2 Exposition-only types, variables, and concepts [simd.expos]") is modeled, and - [(19.2)](#19.2) V​::​size() == size() is true[.](#19.sentence-1) [20](#20) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17883) *Effects*: Initializes the ith element with value_type(reals[i], imags[i]) for all i in the range [0, size())[.](#20.sentence-1) [21](#21) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L17888) *Remarks*: The expression inside explicit evaluates to false if and only if the floating-point conversion rank of T​::​value_type is greater than or equal to the floating-point conversion rank of V​::​value_type[.](#21.sentence-1)