https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91429
Bug ID: 91429 Summary: Conditional explicit not respected with out-of-line definition Product: gcc Version: 9.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: barry.revzin at gmail dot com Target Milestone: --- Reduced from StackOverflow (https://stackoverflow.com/q/57467490/2069064): using size_t = decltype(sizeof(0)); struct Str { template <size_t N> explicit(N > 7) Str(char const (&str)[N]); }; #ifdef OUT_OF_LINE template <size_t N> Str::Str(char const(&str)[N]) { } #endif Str a = "short"; Str b = "not so short"; As-is, gcc correctly rejects the construction of b (since that constructor is explicit). But with -DOUT_OF_LINE, gcc accepts.