由于C语言的历史原因,在C++中,以下定义是等效的:
void foo() {}
void foo(void) {}
当foo位于模板类中时会发生什么?例如:
template <typename T> struct C { void foo(T) {} };
int main()
{ C<void> c;
c.foo();
}
MSVC (19.30) 接受这段代码,但是 gcc (11.2) 拒绝它。
看起来编译器对于当 T = void
时 foo(T)
是否等同于 foo()
存在不同的看法。
哪一个是正确的呢?
void
作为模板参数是无效的。可能是重复的问题:在C++中使用'void'模板参数 - 但自那个问题/答案发布以来(超过9年),事情可能已经发生了变化。 C ++11标准在此答案中引用。 - Adrian Molevoid
作为类模板参数是被允许的,有很多代码使用了它。一个非模板函数声明带有一个(单一的)void
参数类型也是被允许的,但与空参数列表等效。问题在于当void
不是字面上的关键字,而是模板参数的值时,是否允许将其作为函数参数类型。 - user1958486void
不能作为一个模板参数类型(我认为)。 - Adrian Molevoid
参数不是非依赖性的。我真的看不出那个答案为什么不能回答这个问题,所以我将其视为重复问题并关闭。 - Adrian Mole