Un puntero de función de tipo bool (*)()
se puede convertir a std::function<bool()>
pero no es del mismo tipo, por lo que es necesaria una conversión. Antes de que el compilador pueda verificar si esa conversión es posible, necesita deducir ReturnT
como bool
, pero para hacer eso necesita saber que std::function<bool()>
es una posible conversión, que no es posible hasta que deduzca ReturnT
... vea el problema?
Además, tenga en cuenta que bool(*)()
también se puede convertir a std::function<void()>
o std::function<int()>
... ¿Qué se debe deducir?
considerar esta simplificación:
template<typename T>
struct function
{
template<typename U>
function(U) { }
};
template<typename T>
void foo(function<T>)
{ }
int main()
{
foo(1);
}
¿Cómo se puede saber si el compilador desea crear function<int>
o function<char>
o function<void>
cuando todos ellos pueden ser construidos de una forma int
?
Una respuesta a [una de mis preguntas anteriores] (http://stackoverflow.com/questions/9625526/check-at-compile-time-if-template-argument-is-void) permite este tipo de sintaxis. Espero que eso ayude. Está especializado en caso de que el tipo de devolución también sea nulo. – chris
@chris Gracias por la pista, intentaré entenderlo :) –
N.B. muy similar a http://stackoverflow.com/q/7608741/981959 y http://stackoverflow.com/q/9242234/981959, pero creo que las respuestas aquí son más claras para esta pregunta específica. –