diff --git a/include/boost/type_traits/integral_constant.hpp b/include/boost/type_traits/integral_constant.hpp index 2592bcb..7424c86 100644 --- a/include/boost/type_traits/integral_constant.hpp +++ b/include/boost/type_traits/integral_constant.hpp @@ -60,10 +60,11 @@ namespace boost{ operator const mpl::integral_c& ()const { static const char data[sizeof(long)] = { 0 }; - static const void* pdata = data; - return *(reinterpret_cast*>(pdata)); + const void* const pdata = data; + return *static_cast*>(pdata); } - BOOST_CONSTEXPR operator T()const { return val; } + BOOST_CONSTEXPR operator T()const BOOST_NOEXCEPT { return val; } + BOOST_CONSTEXPR T operator()()const BOOST_NOEXCEPT { return val; } }; template @@ -80,10 +81,11 @@ namespace boost{ operator const mpl::bool_& ()const { static const char data[sizeof(long)] = { 0 }; - static const void* pdata = data; - return *(reinterpret_cast*>(pdata)); + const void* const pdata = data; + return *static_cast*>(pdata); } - BOOST_CONSTEXPR operator bool()const { return val; } + BOOST_CONSTEXPR operator bool()const BOOST_NOEXCEPT { return val; } + BOOST_CONSTEXPR bool operator()()const BOOST_NOEXCEPT { return val; } }; template diff --git a/test/integral_constant_test.cpp b/test/integral_constant_test.cpp new file mode 100755 index 0000000..fc4cb35 --- /dev/null +++ b/test/integral_constant_test.cpp @@ -0,0 +1,31 @@ +// Copyright 2025 DoctorNoobingstoneIPresume +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include + +int main () +{ + // [2025-01-07] Adapted from example in https://en.cppreference.com/w/cpp/types/integral_constant ... + +#ifndef BOOST_NO_CXX11_CONSTEXPR + + using two_t = boost::integral_constant ; + using four_t = boost::integral_constant ; + + BOOST_STATIC_ASSERT ((! boost::is_same ::value)); + BOOST_STATIC_ASSERT ((two_t::value * 2 == four_t::value)); + BOOST_STATIC_ASSERT ((two_t () << 1 == four_t ())); + BOOST_STATIC_ASSERT ((two_t () () << 1 == four_t () ())); + + enum class E {e0, e1}; + using c0 = boost::integral_constant ; + using c1 = boost::integral_constant ; + BOOST_STATIC_ASSERT ((c0::value != E::e1)); + BOOST_STATIC_ASSERT ((c0 () == E::e0)); + BOOST_STATIC_ASSERT ((boost::is_same ::value)); +#endif +}