建造一个空洞类型?

Jon*_*Mee 21 c++ void

我得到了一段void()用作参数的代码.代码不编译......很明显?

我们可以实例化任何类型的东西void吗?我相信答案是否定的,除了a void*.例如:

  1. 编写函数void askVoid(void param) {}错误:

参数可能没有void类型

  1. 编写函数void askNaught() {}并使用askNaught(void())`错误调用它:

错误C2660 :: takeNaught函数不带1个参数

  1. 编写模板化函数template <typename T> void takeGeneric(T param) {}并调用它有takeGeneric(void())错误:

错误C2893:无法专门化功能模板 void takeGeneric(T)

  1. 声明void voidType错误:

不允许使用不完整的类型

  1. 声明auto autoVoid = void()错误:

不能推断出auto类型

  1. 声明void* voidPtr工作正常,但remove_pointer_t<decltype(voidPtr)> decltypeVoid错误:

错误C2182 :: decltypeVoid非法使用类型void

就是这样,对吧?void()C++中没有地方可供选择吗?这只是我给出的错误代码,对吧?

tob*_*spr 11

您可以使用void()as函数参数:

void test(void()) { ... }
Run Code Online (Sandbox Code Playgroud)

其中扩展为:

void test(void (*)())
Run Code Online (Sandbox Code Playgroud)

这是一个返回void并且不带参数的方法的函数指针.

完整示例:

void abc() {}
void test(void()) { }

int main() {
    test(abc);
}
Run Code Online (Sandbox Code Playgroud)

  • @JonathanMee:`void(*)()`是一个_function**指针**type_.`void()`是_function type_.这两者是相关的,但[不一样](http://ideone.com/Od7kvo). (3认同)

edm*_*dmz 11

C++(我说C++,而不是C)允许带有返回类型的(§6.6.3逗号2)函数void返回一个void表达式,即:

void foo() { return void(); }
Run Code Online (Sandbox Code Playgroud)

但请注意,它不是构建一个临时的void!

  • 这在通用代码中被大量使用,以避免特殊情况`void`返回函数,其结果是"通过". (8认同)
  • 迷人。所以这只是等价于 `return` 对吗? (2认同)

T.C*_*.C. 9

表达式void()是类型的prvalue,void可以在任何可以使用的表达式中使用,[basic.fundamental]/9有助于提供列表:

  • 作为表达式声明: void();
  • 作为条件运算符的第二个或第三个操作数: true ? throw 1 : void()
  • 作为逗号运算符的操作数: ++it1, void(), ++it2
  • 作为decltype或的操作数noexcept:using my_void = decltype(void()); static_assert(noexcept(void()), "WAT");
  • return返回函数的语句中(可能是cv-qualified)void:const void f() { return void(); }
  • 作为显式转换为(可能是cv-qualified)的操作数void:static_cast<const void>(void())

类型的表达式void也可以用作操作数typeid,但void()特别是在此上下文中将其解析为类型而不是表达式.