boost::function FAQ 項目 3は、私が興味を持っているシナリオに具体的に対応しています。
void リターンの回避策があるのはなぜですか? C++ はそれらを許可します! 次のコード スニペットのように、C++ 標準では void リターンが許可されています。
void f(); void g() { return f(); }
void リターンが使用されないため、これは boost::function の有効な使用法です。void を返すと、次のような形式の悪いコードをコンパイルしようとします。
int f(); void g() { return f(); }
本質的に、void リターンを使用しないと、boost::function が戻り値を飲み込むことができます。これは、正確に一致しないパラメータを持つ関数と関数オブジェクトをユーザーが割り当てて呼び出すことを許可することと一致しています。
残念ながら、これは VS2008 では機能しません:
int Foo();
std::tr1::function<void()> 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 はどうですか?