constexpr basic_vec() noexcept = default; // (1) C++26
template<class U>
constexpr basic_vec(U&& value) noexcept; // (2) C++26
template<class U, class UAbi>
constexpr explicit(/*see below*/)
basic_vec(const basic_vec<U, UAbi>& x) noexcept; // (3) C++26
template<class G>
constexpr explicit basic_vec(G&& gen); // (4) C++26
template<class R, class... Flags>
constexpr basic_vec(R&& r, flags<Flags...> = {}); // (5) C++26
template<class R, class... Flags>
constexpr basic_vec(R&& r, const mask_type& mask,
flags<Flags...> = {}); // (6) C++26
constexpr basic_vec(const real-type& reals,
const real-type& imags = {}) noexcept; // (7) C++26
概要
basic_vecオブジェクトを構築する。
- (1) : デフォルトコンストラクタ。各要素をデフォルト初期化する。
- (2) : ブロードキャストコンストラクタ。単一の値
valueを全要素にコピーする。 - (3) : 変換コンストラクタ。要素数が等しい別の
basic_vecから、要素ごとに要素型を変換して構築する。 - (4) : ジェネレータコンストラクタ。各要素を、そのインデックスを渡した関数オブジェクト
genの呼び出し結果で構築する。 - (5) : 連続範囲
rの先頭からsize()個の要素を読み込んで構築する。 - (6) : マスク付き範囲読み込み。
maskのtrueである要素だけをrから読み込み、falseの要素はvalue_type()で初期化する。 - (7) : 複素数要素型のとき、実部の並び
realsと虚部の並びimagsから構築する。
テンプレートパラメータ制約
- (2) :
std::remove_cvref_t<U>をFromとする。次のいずれかを満たすこと。Uがstd::convertible_to<value_type>を満たし、かつFromが算術型ではないことFromが算術型であり、Fromからvalue_typeへの変換が値を保持する(value-preserving)ことFromが定数ラッパー(std::integral_constant等)であり、そのvalueが算術型で、value_typeで表現可能であること
- (3) :
UからTへの明示的な変換が可能であり、変換元の要素数がsize()と等しいこと - (4) : すべての
i(0以上size()未満)について、gen(std::integral_constant<simd-size-type, i>())の型がstd::convertible_to<value_type>を満たすこと。その型が算術型である場合は、value_typeへの変換が値を保持すること - (5), (6) :
Rがstd::ranges::contiguous_rangeかつstd::ranges::sized_rangeであり、std::ranges::size(r)が定数式かつsize()と等しく、その要素型が「vectorizable type」であってTへ明示的に変換可能であること - (7) :
basic_vecが複素数のデータ並列型(simd-complex)であること
適格要件
- (5), (6) : テンプレートパラメータパック
Flagsが変換フラグを含まない場合、rの要素型からvalue_typeへの変換が値を保持すること
事前条件
- (5), (6) :
Flagsが整列フラグを含む場合、std::ranges::data(r)が要求される境界に整列していること
効果
- (1) : 各要素をデフォルト初期化する。
- (2) : 引数を
value_typeへ変換した値で各要素を初期化する。 - (3) : すべての
iについて、第i要素をstatic_cast<T>(x[i])で初期化する。 - (4) : すべての
iについて、第i要素をstatic_cast<value_type>(gen(std::integral_constant<simd-size-type, i>()))で初期化する。genはiごとにちょうど1回、iの昇順で呼び出される。 - (5), (6) : すべての
iについて、第i要素をmask[i] ? static_cast<T>(std::ranges::data(r)[i]) : T()で初期化する。(5)はmaskをすべてtrueとみなす。 - (7) : すべての
iについて、第i要素をvalue_type(reals[i], imags[i])で初期化する。
explicitになる条件
- (3) : 次のいずれかを満たすとき
explicitとなる。Uからvalue_typeへの変換が値を保持しないUとvalue_typeがともに整数型であり、Uの整数変換順位がvalue_typeより高いUとvalue_typeがともに浮動小数点型であり、Uの浮動小数点変換順位がvalue_typeより高い
例外
- (1), (2), (3), (6), (7) : 投げない
- (4), (5) : 「例外を投げない」とは規定されない
例
#include <simd>
#include <print>
#include <array>
namespace simd = std::simd;
template <class V>
void print(const char* name, const V& v)
{
std::print("{}: ", name);
for (int i = 0; i < v.size(); ++i) {
std::print("{} ", v[i]);
}
std::println("");
}
int main()
{
// (2) ブロードキャスト:全要素を同じ値に
simd::vec<int, 4> b = 10;
// (4) ジェネレータ:各要素をインデックスから生成
simd::vec<int, 4> c([](int i) { return i + 1; });
// (5) 連続範囲から読み込み
std::array<int, 4> arr = {5, 6, 7, 8};
simd::vec<int, 4> d{arr};
// (3) 要素型を変換
simd::vec<float, 4> e = simd::vec<int, 4>(c);
::print("b", b);
::print("c", c);
::print("d", d);
::print("e", e);
}
出力
b: 10 10 10 10
c: 1 2 3 4
d: 5 6 7 8
e: 1 2 3 4
バージョン
言語
- C++26
処理系
- Clang: 22 ❌
- GCC: 16.1 ❌
- Visual C++: 2026 Update 2 ❌
関連項目
参照
- P1928R15 std::simd — merge data-parallel types from the Parallelism TS 2
- C++26で
std::simdが追加された
- C++26で
- P2876R3 Proposal to extend
std::simdwith more constructors and accessors- 範囲読み込み・ジェネレータ・複素数用のコンストラクタが追加された