c++代码中void的奇怪用法

Strange use of void in c++ code

本文关键字:用法 void 代码 c++      更新时间:2023-10-16

下面是一些关于c++异步任务的演示代码

template <class T> class Future<T>{
  //something
  void  foo(std::function<void(T)> cb);    
  //something
};

void(T)是什么意思?

void(T)是什么意思?

指定函数类型;具体来说,一个函数接受一个T类型的参数,不返回任何东西。一般来说,复杂类型的类型说明符看起来像它们对应的变量声明,但没有变量名:

void f(T); // declare a function
void(T)    // specifier for a function type
int a[42]; // declare an array
int[42]    // specifier for an array type

在本例中,函数类型用于指定std::function的函数调用操作符的签名:

void operator()(T);

,这样函数对象就可以像函数一样被使用了:

T some_t;
cb(some_t); // usable like a function taking `T`

cbstd::function,其operator()接受T并返回void

void(T)是一个函数签名(类型)

注意签名不是指向函数的指针,不是指向成员函数的指针,也没有lambda:

#include<functional>
void a(int) {}
struct B {
    void f(int) {}
};

int main() {
    std::function<void(int)> fn;
    fn = a;
    B b;
    fn = std::bind(&B::f, b, std::placeholders::_1);
    auto lambda = [](int) {};
    fn = lambda;
}

根据c++ 11规范解释如下:A parameter list consisting of a single unnamed parameter of non-dependent type void is equivalent to an empty parameter list.

void不是函数的有效实参类型,但是void(T)中的T是一个依赖类型,它依赖于模板形参。这样就可以在基于模板形参的函数中没有参数。