https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97220
Bug ID: 97220 Summary: Overload resolution works wrong when implicit conversion not exists Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: konstantin.vladimirov at gmail dot com Target Milestone: --- Minimal reproducer is here: https://godbolt.org/z/rd4e9a struct S { explicit S(int, int, int) {} }; struct T { T(int, int, int) {} }; void foo(struct S) {} // 1 void foo(struct T) {} // 2 int main() { S s{1, 2, 3}; foo({1, 2, 3}); } By C++ standard, [over.match.viable], "for F to be a viable function, there shall exist for each argument an implicit conversion sequence (12.4.3.1) that converts that argument to the corresponding parameter of F" So 1 is not viable overload and resolution shall peek 2 But in reality now error produced: error: call of overloaded 'foo(<brace-enclosed initializer list>)' is ambiguous