在逗号分隔列表中使用`void()`?
当我看到这个时,我正在查看其他人编写的一段代码:
a(), void(), b();
其中a
和b
都是用户定义的模板类的实例,通过重载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>
),因为这样的重载不能有void
types的参数。
你会经常看到这个在模板中使用,并用于variadic pack扩展:
// C++11/14: int unpack[] = {0, (do_something(pack), void(), 0)...}; // C++17 (fold expression): (void(do_something(pack)), ...);
如果超载的operator,
可能会破坏语言的顺序保证 。