boost :: funkcja FAQ item 3 specjalnie rozwiązuje scenariusz Jestem zainteresowany:Czy funkcja tr1 :: function połknąć może wartości zwracane?
Dlaczego istnieją obejścia dla pustych zwrotów? C++ pozwala im! Void powraca są dozwolone przez standard C++, jak w tym fragmencie kodu:
void f(); void g() { return f(); }
Jest to ważny wykorzystanie podwyższając :: bo nieważne powraca nie są używane. Z pustych deklaracji, chcielibyśmy próbuje skompilować źle sformułowane kodu podobnego do:
int f(); void g() { return f(); }
w istocie, nie używając void powraca pozwala boost :: funkcja połknąć wartość powrotną. Jest to zgodne z , umożliwiając użytkownikowi przypisanie i wywołanie funkcji i obiektów funkcji z parametrami, które nie są dokładnie zgodne z .
Niestety, to nie działa w VS2008:
int Foo();
std::tr1::function<void()> Bar = Foo;
ta produkuje błędów zaczynając:
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
Czy jest to wadą wykonania VS2008 TR1? Czy to działa w VS2010? Czy TR1 spełnia tę funkcję? A co z C++ 0x?
VS2010 podaje ten sam błąd. – Xeo
'void g() {return f(); } 'jest dozwolone do obsługi kodu szablonu, gdzie typ powrotu funkcji może nie być znany z góry ... nadal jest to błąd dla' f() ', aby rzeczywiście zwrócić wartość, jeśli' g() 'nie. Biorąc to pod uwagę, nie zdziwiłbym się stwierdzeniem, że komitet ds. Standardów zdecydował się odejść od wdrożenia Boost w tym zakresie, ponieważ zapewnia bardziej intuicyjne zachowanie. Ale ponieważ gcc * nie pozwala na takie zachowanie, nie jestem pozytywny. –