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.

Reply via email to