【发布时间】:2016-10-08 15:39:05
【问题描述】:
我得到了一段使用void() 作为参数的代码。代码无法编译……显然?
我们可以实例化void 类型的任何东西吗?我相信答案是否定的,除了void*。例如:
- 写函数
void askVoid(void param) {}错误:
参数可能没有
void类型
- 编写函数
void askNaught() {}并使用 askNaught(void())` 错误调用它:
错误 C2660:
takeNaught:函数不接受 1 个参数
- 编写模板化函数
template <typename T> void takeGeneric(T param) {}并使用takeGeneric(void())错误调用它:
错误 C2893:无法专门化函数模板
void takeGeneric(T)
- 声明
void voidType错误:
不允许不完整的类型
- 声明
auto autoVoid = void()错误:
无法推断
auto类型
- 声明
void* voidPtr工作正常,但remove_pointer_t<decltype(voidPtr)> decltypeVoid错误:
错误C2182:
decltypeVoid:非法使用类型void
就是这样,对吧? C++ 中没有void() 的位置吗?这只是我得到的错误代码,对吧?
【问题讨论】:
-
您可以在返回
void的函数中返回void函数调用:void a() {}; void b() { return a(); }。这是一种 void 类型的表达式。 -
@rodrigo 在这种情况下
a()会被执行吗?这很奇怪,但我的编译器没有抱怨。类似于只调用a()作为b()的最后一行我猜。 -
是的,和只是调用函数然后返回是一样的。简化模板的编写是 C++ 类型系统中的一个特殊规则:
template<typename T> T foo() { return bar<T>(); }。否则,您将需要模板专业化,以便在T=void时删除虚假的returns。 -
@rodrigo 太棒了,当你把它放在那个上下文中时,我看到能够用
void调用return的重要性。我建议您将其放入答案中,但它看起来像 Black got there first,尽管它实际上并没有使用我所询问的类型。 -
实际上,写@Black 的答案只是涵盖了原始问题,IMO。如果他愿意,我邀请他从我的评论中复制模板内容。