On Mon, 29 Jan 2024, 18:17 Martin Licht via Gcc, <gcc@gcc.gnu.org> wrote:
> GCC seems to have a non-standard lenient C++ overload resolution that is > not documented (or easy to find in the manual). > > The following C++ code compiles with GCC. However, it produces a warning > about an ambiguous overload that apparently is not acceptable by the > standard. Clang and MVSC simply reject the code because of the ambiguous > overload. > > ``` > // reduced example > #include <iostream> > using namespace std; > struct A{}; > struct B: public A {}; > struct C{}; > struct D{ D() = default; D(const C&){}; }; > > void p( A&, const C& ){ cout << "AC\n"; }; > void p( B&, const D& ){ cout << "BD\n"; }; > > int main() { > B b; C c; > p(b,c); // ambiguous call > return 0; > } > ``` > > GCC detects ambiguity in which `p` to choose: either cast from derived > class B& to base class A& or construct D from C. > > ``` > $ g++ test.cpp > test.cpp: In function ‘int main()’: > test.cpp:51:10: warning: ISO C++ says that these are ambiguous, even > though the worst conversion for the first is better than the worst > conversion for the second: > 51 | p(b,c); > | ~^~~~~ > test.cpp:12:6: note: candidate 1: ‘void p(A&, const C&)’ > 12 | void p( A&, const C& ){ cout << "AC\n"; }; > | ^ > test.cpp:15:6: note: candidate 2: ‘void p(B&, const D&)’ > 15 | void p( B&, const D& ){ cout << "BD\n"; }; > | ^ > ``` > > With `-pedantic` it does not compile anymore. I subjectively agree with > GCC that the first choice is better than the second. But not everyone > may do so. Is there a documentation of all these deviations from the > standard? > The standard says this is ill-formed and requires a diagnostic, and gcc gives you a diagnostic. So it's not strictly-speaking a deviation from the standard. I don't think there are docs for this or for other similar "pedwarn" extensions. >