diff --git a/src/Magnum/Math/Dual.h b/src/Magnum/Math/Dual.h index da09c5757..14aa88488 100644 --- a/src/Magnum/Math/Dual.h +++ b/src/Magnum/Math/Dual.h @@ -59,6 +59,15 @@ template class Dual { */ constexpr /*implicit*/ Dual() noexcept: _real{}, _dual{} {} + /** @brief Construct zero-initialized dual number */ + #ifdef DOXYGEN_GENERATING_OUTPUT + constexpr /*implicit*/ Dual(ZeroInitT) noexcept; + #else + /* MSVC 2015 can't handle {} instead of ::value */ + template::value>::type> constexpr /*implicit*/ Dual(ZeroInitT) noexcept: _real{}, _dual{} {} + template::value>::type> constexpr /*implicit*/ Dual(ZeroInitT) noexcept: _real{ZeroInit}, _dual{ZeroInit} {} + #endif + /** @brief Construct without initializing the contents */ #ifdef DOXYGEN_GENERATING_OUTPUT explicit Dual(NoInitT) noexcept; diff --git a/src/Magnum/Math/Test/DualTest.cpp b/src/Magnum/Math/Test/DualTest.cpp index dbb5c4b44..973b56f7c 100644 --- a/src/Magnum/Math/Test/DualTest.cpp +++ b/src/Magnum/Math/Test/DualTest.cpp @@ -37,6 +37,7 @@ struct DualTest: Corrade::TestSuite::Tester { void construct(); void constructDefault(); + void constructZero(); void constructNoInit(); void constructConversion(); void constructCopy(); @@ -73,6 +74,7 @@ using namespace Literals; DualTest::DualTest() { addTests({&DualTest::construct, &DualTest::constructDefault, + &DualTest::constructZero, &DualTest::constructNoInit, &DualTest::constructConversion, &DualTest::constructCopy, @@ -120,6 +122,16 @@ void DualTest::constructDefault() { CORRADE_VERIFY(std::is_nothrow_default_constructible::value); } +void DualTest::constructZero() { + constexpr Dual a{ZeroInit}; + constexpr Math::Dual> b{ZeroInit}; + CORRADE_COMPARE(a, Dual(0.0f, 0.0f)); + CORRADE_COMPARE(b, Math::Dual>({{0.0f, 0.0f, 0.0f}, 0.0f}, {{0.0f, 0.0f, 0.0f}, 0.0f})); + + CORRADE_VERIFY((std::is_nothrow_constructible::value)); + CORRADE_VERIFY((std::is_nothrow_constructible>, ZeroInitT>::value)); +} + void DualTest::constructNoInit() { Dual a{2.0f, -7.5f}; Math::Dual> b{{{3.0f, 0.1f, 1.0f}, 1.0f}, {{0.1f, 0.0f, 1.0f}, 0.3f}};