El impulso :: función FAQ item 3 aborda específicamente el escenario Estoy interesado en:¿Puede tr1 :: funcionar tragar los valores devueltos?
¿Por qué hay soluciones para huecos retornos? C++ les permite! regresa vacía son permitidos por la norma de C++, como en este fragmento de código:
void f(); void g() { return f(); }
Este es un uso válido de impulso :: función porque los retornos vacíos no se utilizan. Con retornos de vacío, que sería intentar compilar mal formada código similar a:
int f(); void g() { return f(); }
En esencia, no usar void Devuelve permite impulso :: función de tragar un valor retorno. Esto es coherente con que permite al usuario asignar e invocar a las funciones y objetos de función con los parámetros que no coinciden exactamente.
Por desgracia, esto no funciona en VS2008:
int Foo();
std::tr1::function<void()> Bar = Foo;
Esto produce errores a partir de:
c:\Program Files\Microsoft Visual Studio 9.0\VC\include\xxcallfun(7) : error C2562: 'std::tr1::_Callable_fun<_Ty>::_ApplyX' : 'void' function returning a value
Es éste un defecto de la aplicación VS2008 TR1? Funciona esto en VS2010? ¿TR1 aborda esta capacidad? ¿Qué hay de C++ 0x?
VS2010 da el mismo error. – Xeo
'void g() {return f(); } 'está permitido admitir código de plantilla donde el tipo de retorno de la función podría no conocerse de antemano ... aún es un error para' f() 'devolver realmente un valor si' g() 'no lo hace. Ante esto, no me sorprendería encontrar que el comité de estándares eligió divergir de la implementación de Boost en este aspecto, ya que proporciona un comportamiento más intuitivo. Pero como gcc * does * permite este comportamiento, no soy positivo. –