次の最小限の例を見てください。
using Type1 = std::function<void(void)>;
template <typename T>
using Type2 = std::function<void(T)>;
Type1 whyDoesThisWork;
Type2<void> andYetThisDoesNot;
2 番目の型エイリアスの場合、「引数に 'void' 型がない可能性があります」というエラーが表示されます。(Xcode 4.5、Clang/c++11/libc++、OS X 10.7 でテストしました。)
Type1
これは奇妙だと思いますType2<void>
。何が起きてる?また、エラーの代わりに書き込みと取得ができるように、2 番目の型エイリアスを書き直す方法はありますか?Type2<void>
std::function<void(void)>
編集おそらく、これが必要な理由は、次のようなことを許可することであると付け加える必要があります。
template <typename ... T>
using Continuation = std::function<void(T...)>;
auto someFunc = []() -> void {
printf("I'm returning void!\n");
};
Continuation<decltype(someFunc())> c;
Continuation<decltype(someFunc())>
になりContinuation<void>
、エラーが発生します。