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.