diff --git a/include/boost/sml.hpp b/include/boost/sml.hpp index 0807cd90..b8fb90f9 100644 --- a/include/boost/sml.hpp +++ b/include/boost/sml.hpp @@ -3135,7 +3135,7 @@ struct transition, state> : transition, state, front template struct transition_sg, G> : transition, state, front::event, G, none> { using transition, state, front::event, G, none>::g; - transition_sg(const state &, const G &g_init) + constexpr transition_sg(const state &, const G &g_init) : transition, state, front::event, G, none>{g_init, none{}} {} template constexpr auto operator/(const T &t) const { @@ -3149,7 +3149,7 @@ struct transition_sg, G> : transition, state, fron template struct transition_sa, A> : transition, state, front::event, always, A> { using transition, state, front::event, always, A>::a; - transition_sa(const state &, const A &a_init) + constexpr transition_sa(const state &, const A &a_init) : transition, state, front::event, always, A>{always{}, a_init} {} template constexpr auto operator=(const T &) const { diff --git a/test/ft/constexpr.cpp b/test/ft/constexpr.cpp index 752c9a47..b4b03602 100644 --- a/test/ft/constexpr.cpp +++ b/test/ft/constexpr.cpp @@ -13,6 +13,8 @@ namespace sml = boost::sml; struct e1 {}; const auto idle = sml::state; +const auto s1 = sml::state; +const auto s2 = sml::state; test constexpr_sm = [] { using namespace sml; @@ -37,3 +39,23 @@ test constexpr_sm = [] { static_assert(test()); }; + +test constexpr_anonymous_transitions_sm = [] { + using namespace sml; + struct c { + // clang-format off + constexpr auto operator()() noexcept { + const auto guard = [] { return true; }; + const auto action = [] {}; + return make_transition_table( + *idle + event = s1, + s1[guard] = s2, + s2 / action = X + ); + } + // clang-format on + }; + + constexpr sml::sm> sm{}; + (void)sm; +};