https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60095
Eric Gallager <egallager at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |WAITING Last reconfirmed| |2017-08-21 CC| |egallager at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #3 from Eric Gallager <egallager at gcc dot gnu.org> --- (In reply to lucdanton from comment #0) > Using ‘gcc version 4.9.0 20140123 (experimental) (GCC)’ with the following > snippet: > > //-------- > > struct foo { > typedef void(*ptr)(int&); > operator ptr() const; > }; > > int main() > { > foo f; > void* p = 0; > f(p); > } > > //-------- > > $ g++-trunk -std=c++03 main.cpp > main.cpp: In function 'int main()': > main.cpp:10:8: error: no match for call to '(foo) (void*&)' > f(p); > ^ > main.cpp:1:8: note: candidate is: > struct foo { > ^ > main.cpp:10:8: note: foo::ptr {aka void (*)(int&)} <conversion> > f(p); > ^ > main.cpp:10:8: note: candidate expects 2 arguments, 2 provided > > Same output for all -std=c++{03,11,1y} modes. If e.g. foo has a call > operator instead, then the appropriate ‘no known conversion for argument 1 > from 'void*' to 'int&'’ is produced. Message is now: $ /usr/local/bin/g++ -c -std=c++03 -Wall -Wextra -pedantic 60095.cc 60095.cc: In function ‘int main()’: 60095.cc:10:8: error: no match for call to ‘(foo) (void*&)’ f(p); ^ 60095.cc:10:8: note: candidate: ‘foo::ptr {aka void (*)(int&)}’ <conversion> 60095.cc:10:8: note: conversion of argument 2 would be ill-formed: 60095.cc:10:8: error: invalid conversion from ‘void*’ to ‘int’ [-fpermissive] 60095.cc:10:8: error: cannot bind rvalue ‘(int)p’ to ‘int&’ $ Is that better enough for you? I think it's still kinda confusing, but at least there's no longer the bogus "expects 2 arguments, 2 provided" note anymore.