https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98388
Bug ID: 98388 Summary: Throwing move-only parameter results in hard error in SFINAE context Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ensadc at mailnesia dot com Target Milestone: --- https://godbolt.org/z/xn8fYz ==== struct moveonly { moveonly() = default; moveonly(moveonly&&) = default; }; template<class T> constexpr auto is_throwable(T t) -> decltype(throw t, true) { return true; } template<class T> constexpr bool is_throwable(...) { return false; } constexpr bool b = is_throwable<moveonly>(moveonly{}); ==== <source>: In substitution of 'template<class T> constexpr decltype ((<throw-expression>, true)) is_throwable(T) [with T = moveonly]': <source>:13:43: required from here <source>:7:46: error: use of deleted function 'constexpr moveonly::moveonly(const moveonly&)' 7 | constexpr auto is_throwable(T t) -> decltype(throw t, true) { | ^~~~~~~ <source>:1:8: note: 'constexpr moveonly::moveonly(const moveonly&)' is implicitly declared as deleted because 'moveonly' declares a move constructor or move assignment operator 1 | struct moveonly { | ^~~~~~~~ <source>:7:52: note: in thrown expression 7 | constexpr auto is_throwable(T t) -> decltype(throw t, true) { | ^ ==== I'm not sure what the value of `b` should be, but I believe that it should not be a hard error. (Clang and MSVC initialize `b` to `true`.)