disponibilidad comandos clusvcadm cluster alta c++ templates inheritance lambda overloading

c++ - comandos - clusvcadm



Resolución de sobrecarga para funciones heredadas (1)

Es simple cuando lo ves: tu operador no está completamente calificado, mientras que el de lambda sí lo está (a menos que lo definas como mutable ). Por lo tanto, es una mejor coincidencia para su instancia no constante de Poc .

Solo agrega la const falta:

auto operator() (Ts...) const

Quiero tener una estructura que tome un número arbitrario de lambdas y sirva como un punto de llamada central para todos sus operadores de llamadas.

Si se invoca al operador de llamada con una lista de argumentos que no coincide con ninguno de los lambdas dados en la construcción, se debe llamar a un operador de llamada predeterminado.

Pensé que el siguiente código lograría exactamente esto. El operador de llamada para cada lambda se "eleva" a la clase Poc mediante el using .

template <typename ...Lambdas> struct Poc : Lambdas... { using Lambdas::operator() ...; // Lift the lambda operators into the class template <typename ...Ts> auto operator() (Ts...) { std::cout << "general call" << std::endl; } }; // Deduction guide template <typename ...Ts> Poc(Ts... ts)->Poc<Ts...>; int main() { auto l_int = [](int) {std::cout << "int" << std::endl; }; Poc poc{l_int}; poc(1);//calls the default operator. why? return 0; }

Cuando no tengo el operador de llamada predeterminado en la estructura, todo funciona como se espera (con listas de argumentos válidas). Si lo agrego a la estructura (como en el código anterior), se llama al operador predeterminado cada vez, sin importar con qué argumentos lo llame.

En mi entendimiento, los operadores de llamada lambda y el operador de llamada de estructuras (predeterminado) están presentes en el mismo ámbito. Por lo tanto, todos deben ser revisados ​​para la resolución de sobrecarga. Dado que el operador lamdba es más específico que el operador genérico predeterminado, se debe elegir.

Aparentemente, ese no es el caso. ¿Porqué es eso?

Probé en Microsoft Visual C ++ , Clang y GCC (todos en sus últimas versiones).

Editar: