在逗号分隔列表中使用`void()`?

当我看到这个时,我正在查看其他人编写的一段代码:

a(), void(), b(); 

其中ab都是用户定义的模板类的实例,通过重载operator()来返callback用实例本身,该模板类似于函数。

class级的一部分:

 template <typename T> class SomeClass{ public: SomeClass& operator()(void); const SomeClass& operator()(void) const; } 

这两个重载的返回语句如下:

 template <typename T> SomeClass<T>& SomeClass<T>::operator()(void){ // do stuff return *this; } template <typename T> const SomeClass<T>& SomeClass<T>::operator()(void) const{ // do stuff return *this; } 

他们之间的void()是做什么的? 我觉得很奇怪

void()防止重载operator,被调用(其中一个参数的types为SomeClass<T> ),因为这样的重载不能有voidtypes的参数。

你会经常看到这个在模板中使用,并用于variadic pack扩展:

 // C++11/14: int unpack[] = {0, (do_something(pack), void(), 0)...}; // C++17 (fold expression): (void(do_something(pack)), ...); 

如果超载的operator,可能会破坏语言的顺序保证 。