当type参数为void时,无法实例化函数模板

Naw*_*waz 3 c++ templates c++11

我们知道以下代码编译正常:

void f() {}
void g(void) {}

f();
g();
Run Code Online (Sandbox Code Playgroud)

但为什么不是以下内容:

template<typename T>
void f() {}

template<typename T>
void g(T) {}

f<void>();  //ok
g<void>();  //error
Run Code Online (Sandbox Code Playgroud)

为什么线条g<void>() 会出错

错误:没有匹配函数来调用'g()'

为什么不能用void类型参数进行实例化?为什么函数模板没有实例化为:

void g(void) {}  //to be instantiated from the function template
Run Code Online (Sandbox Code Playgroud)

毕竟,这是我要求的.

我正在寻找权威的答案.

Pet*_*ker 5

法律主义论点是void一个无法完成的不完整类型,因此永远不能用作顶级类型.比较void a;.这有点令人困惑,因为void在参数列表中不是一个类型,而是一个表示没有参数的约定.