https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115727
Bug ID: 115727 Summary: gcc allows implicit usage of explicit constructor in "std::initializer_list" Product: gcc Version: 13.2.0 Status: UNCONFIRMED Keywords: accepts-invalid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: rush102333 at gmail dot com Target Milestone: --- In the following test case, the ctor of class "S" is declared explicit, so expression like "S s=0" or "S s={0}" is forbidden. But when it's used as a parameter in direct initialization of a std::initializer_list variable, the "S s=0" form is accepted by gcc-13.2: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <initializer_list> struct S { explicit S(int) { }}; int main() { //reject //std::initializer_list<S> ss={42}; //reject //std::initializer_list<S> ss={{42}}; //reject //std::initializer_list<S> ss({{42}}); //accept std::initializer_list<S> ss({42}); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Clang rejects the code anyway. Please check https://godbolt.org/z/EbE6GPnda.