Created on 2025-10-28.00:00:00 last changed 1 month ago
Proposed resolution:
This wording is relative to N5014.
Modify [simd.ctor] as indicated:
template<class U> constexpr explicit(see below) basic_vec(U&& value) noexcept;-1- Let `From` denote the type remove_cvref_t<U>.
-2- Constraints: `value_type` satisfies constructible_from<U>. -3- Effects: Initializes each element to the value of the argument after conversion to `value_type`. -4- Remarks: The expression inside explicit evaluates to `false` if and only if`U` satisfies convertible_to<value_type>, andeither
- (4.1) — `U` satisfies convertible_to<value_type> and `From` is not an arithmetic type and does not satisfy constexpr-wrapper-like,
- (4.2) — `From` is an arithmetic type and the conversion from `From` to `value_type` is value-preserving ([simd.general]), or
- (4.3) — `From` satisfies constexpr-wrapper-like, remove_const_t<decltype(From::value)> is an arithmetic type, and `From::value` is representable by `value_type`.
[simd.ctor] p4 requires all implicit conversions via broadcast constructor to satisfy convertible_to<value_type>. However, std::cw<0.f> is not convertible to `float16_t` because `float` does not satisfy convertible_to<float16_t>. Consequently, with the current wording we don't arrive at bullet (4.3) which allows not-value-preserving conversions if the value is known to not change on conversion. The `convertible_to` constraint is implicit in bullet (4.2), not needed/wrong for bullet (4.3) and thus needs to be moved into bullet (4.1).
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2025-10-31 10:39:22 | admin | set | messages: + msg15473 |
| 2025-10-28 00:00:00 | admin | create | |