【发布时间】:2025-12-16 20:20:03
【问题描述】:
举一个最小的例子:
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>,我得到了错误。
【问题讨论】:
-
呵呵,反之亦然(
T(void))... -
如果我不得不猜测,我会说
void(void)只是void()的礼貌兼容性表示法,但void实际上不是有效的参数类型。
标签: c++ templates c++11 std-function