https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66338
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Pawel Tomulik from comment #2) > Anyway, adding explicit to S(T&&) solves the problem... Or constrain your greedy template so it only accepts arguments that can be assigned to S::i_ struct S { int i_; template<typename T, typename Require = decltype(std::declval<int&>() = std::declval<T>())> S(T&& i) noexcept(noexcept(i_ = i)) { i_ = i; } S() noexcept : i_{0} {}; };