Функция boost :: function Пункт 3 часто задаваемых вопросов конкретно касается сценария, который меня интересует:
Почему существуют обходные пути для void возвращается? C ++ позволяет им! Пустота возвращается разрешены стандартом C ++, так как в этом фрагменте кода:
void f (); void g () {вернуть f (); }
Это допустимое использование boost :: function, потому что void возвращает не используются. С недействительными возвратами мы будет пытаться скомпилировать плохо сформированный код похож на:
int f (); void g () {вернуть f (); }
По сути, не используется возврат недействительных позволяет boost :: function проглотить возвращаемое значение. Это соответствует позволяя пользователю назначать и вызывать функции и функциональные объекты с параметры, которые не совсем совпадают.
К сожалению, это не работает в VS2008:
int Foo();
std::tr1::function Bar = Foo;
Это приводит к ошибкам, начинающимся с:
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
Является ли это ошибкой реализации VS2008 TR1? Это работает в VS2010? Обращается ли TR1 к этой возможности? А как насчет C ++ 0x?