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: