采取以下最小示例:
using Type1 = std::function<void(void)>;
template <typename T>
using Type2 = std::function<void(T)>;
Type1 whyDoesThisWork;
Type2<void> andYetThisDoesNot;
如果是第二种类型的别名,我会收到错误“参数可能没有 'void' 类型”。(我使用 Xcode 4.5、Clang/c++11/libc++、OS X 10.7 进行了测试。)
我觉得这很奇怪:我本来期望Type1
并且Type2<void>
行为相同。这里发生了什么?有没有办法重写第二种类型的别名,以便我可以编写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>
了,我得到了错误。