Может ли tr1 :: function проглатывать возвращаемые значения?

Функция 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?

9
задан Chris 8 July 2011 в 17:59
поделиться