c++ - function overloading with std::function and generic lambdas: std::string preferred over int -


when trying compiling this, suprisingly, gives error because auto parameter of lambda function has been resolved std::string, , compiler doesn't know how convert std::string int or widget when calling test.

but, wonder why compiler has choosen second invok function instead of first one, when first 1 succeed:

#include <string> #include <functional>  struct widget {};  bool test(int ); bool test(widget );  void invok(std::function<bool(int)> );         // #1 void invok(std::function<bool(std::string)> ); // #2  int main() {     // error: unresolved overloaded function type     // invok(test);                   // still error: no known conversion std::string     // int or widget     invok([](auto&& x) {               return test(std::forward<decltype(x)>(x));     });  } 

that example has been copied a c++ proposal.

the compiler didn't choose #2. it's trying decide if can choose #2.

to that, asks "can generic lambda converted std::function<bool(std::string)>"?

std::function's converting constructor says "only if it's callable std::string rvalue , result type convertible bool".

compiler tries that, deduce auto std::string, substitute signature of function call operator...success! oops, return type auto, , needs actual type answer "is convertible" question. instantiates body of function call operator template figure out return type.

ouch. body isn't valid std::string after all. hard error , explosions follow.


Comments

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -