diff --git a/src/core/include/mp-units/cartesian_vector.h b/src/core/include/mp-units/cartesian_vector.h index 0749fae0..76f8a91e 100644 --- a/src/core/include/mp-units/cartesian_vector.h +++ b/src/core/include/mp-units/cartesian_vector.h @@ -53,26 +53,30 @@ public: T _coordinates_[3]; using value_type = T; - cartesian_vector() = default; cartesian_vector(const cartesian_vector&) = default; cartesian_vector(cartesian_vector&&) = default; cartesian_vector& operator=(const cartesian_vector&) = default; cartesian_vector& operator=(cartesian_vector&&) = default; - template Arg1, std::convertible_to... Args> - constexpr cartesian_vector(Arg1&& arg1, Args&&... args) : - _coordinates_(std::forward(arg1), std::forward(args)...) + template + requires(... && std::constructible_from) + constexpr explicit(!(... && std::convertible_to)) cartesian_vector(Args&&... args) : + _coordinates_{static_cast(std::forward(args))...} { } - template U> - constexpr cartesian_vector(const cartesian_vector& other) : _coordinates_{other[0], other[1], other[2]} + template + requires std::constructible_from + constexpr explicit(!std::convertible_to) cartesian_vector(const cartesian_vector& other) : + _coordinates_{static_cast(other[0]), static_cast(other[1]), static_cast(other[2])} { } - template U> - constexpr cartesian_vector(cartesian_vector&& other) : - _coordinates_{std::move(other[0]), std::move(other[1]), std::move(other[2])} + template + requires std::constructible_from + constexpr explicit(!std::convertible_to) cartesian_vector(cartesian_vector&& other) : + _coordinates_{static_cast(std::move(other[0])), static_cast(std::move(other[1])), + static_cast(std::move(other[2]))} { } diff --git a/test/runtime/cartesian_vector_test.cpp b/test/runtime/cartesian_vector_test.cpp index 252134d0..836451a8 100644 --- a/test/runtime/cartesian_vector_test.cpp +++ b/test/runtime/cartesian_vector_test.cpp @@ -43,6 +43,22 @@ TEST_CASE("cartesian_vector operations", "[vector]") { SECTION("cartesian_vector initialization and access") { + SECTION("no arguments") + { + cartesian_vector v; + REQUIRE(v[0] == 0); + REQUIRE(v[1] == 0); + REQUIRE(v[2] == 0); + } + + SECTION("zero arguments") + { + cartesian_vector v{}; + REQUIRE(v[0] == 0); + REQUIRE(v[1] == 0); + REQUIRE(v[2] == 0); + } + SECTION("one argument") { cartesian_vector v{1.0}; @@ -66,6 +82,14 @@ TEST_CASE("cartesian_vector operations", "[vector]") REQUIRE(v[1] == 2.0); REQUIRE(v[2] == 3.0); } + + SECTION("convertible arguments") + { + cartesian_vector v{1, 2, 3}; + REQUIRE(v[0] == 1.0); + REQUIRE(v[1] == 2.0); + REQUIRE(v[2] == 3.0); + } } SECTION("convertibility")